Oracle
 sql >> база данни >  >> RDS >> Oracle

УНИКАЛНО ограничение срещу проверка преди INSERT

Мисля, че в повечето случаи разликите между тези две ще бъдат достатъчно малки, че изборът трябва да се ръководи най-вече от избора на реализация, която в крайна сметка е най-разбираема за някой, който гледа кода за първи път.

Въпреки това мисля, че обработката на изключения има няколко малки предимства:

  • Обработката на изключения избягва потенциално състояние на състезанието. Методът „проверете, след това вмъкнете“ може да се провали, ако друг процес вмъкне запис между вашата проверка и вмъкването. Така че, дори и да правите „проверете, след това вмъкнете“, вие пак искате обработка на изключения във вмъкването и ако така или иначе вече извършвате обработка на изключения, можете също да премахнете първоначалната проверка.

  • Ако вашият код не е съхранена процедура и трябва да взаимодейства с базата данни през мрежата (т.е. приложението и db не са в една и съща кутия), тогава искате да избегнете две отделни мрежови повиквания (едно за проверка и друго за вмъкването) и това чрез обработка на изключения осигурява лесен начин за обработка на цялото нещо с едно мрежово повикване. Сега има много начини да направите метода „проверете и след това вмъкнете“, като същевременно избягвате второто мрежово повикване, но простото улавяне на изключението вероятно ще бъде най-простият начин да направите това.

От друга страна, обработката на изключения изисква уникално ограничение (което наистина е уникален индекс), което идва с компромис с производителността:

  • Създаването на уникално ограничение ще бъде бавно при много големи таблици и ще доведе до спад в производителността при всяко отделно вмъкване в тази таблица. При наистина големи бази данни трябва да предвидите и допълнителното дисково пространство, консумирано от уникалния индекс, използван за налагане на ограничението.
  • От друга страна, това може да направи избора от таблицата по-бърз, ако вашите заявки могат да се възползват от този индекс.

Бих искал също да отбележа, че ако сте в ситуация, в която това, което всъщност искате да направите, е „актуализиране на вмъкване на друго“ (т.е. ако вече съществува запис с уникалната стойност, тогава искате да актуализирате този запис, в противен случай вмъквате нов запис), тогава това, което всъщност искате да използвате, е методът UPSERT на вашата конкретна база данни, ако има такъв. За SQL Server и Oracle това би било оператор MERGE.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Синтаксис на Oracle SQL:Идентификатор в цитати

  2. Имена на колони за цитати на Oracle DB

  3. Кога трябва да използвам точка и запетая срещу наклонена черта в Oracle SQL?

  4. Какво и кога трябва да посоча setFetchSize()?

  5. SQL Developer няма да стартира