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

Ограничение за двупосочен външен ключ

„Вярвам, че това е невъзможно. Не можете да създадете адресен запис, докато не знаете идентификационния номер на лицето и не можете да вмъкнете записа на лицето, докато не знаете AddressId за полето PrimaryAddressId.“

На пръв поглед това твърдение изглежда ТОЛКОВА привлекателно. Въпреки това е доста благоприятно.

Това е много често срещан вид проблем, който доставчиците на SQL СУБД се опитват да атакуват вече може би десетилетия.

Ключът е, че всички проверки на ограничения трябва да бъдат "отложени", докато и двете вмъквания не бъдат направени. Това може да се постигне под различни форми. Транзакциите в базата данни могат да предложат възможността да направите нещо като "SET deferred constraint checking ON" и сте готови (ако не беше фактът, че в този конкретен пример, вероятно ще трябва да се забърквате много с вашия дизайн, за да за да можете просто да ДЕФИНИРАТЕ двете FK ограничения, защото едно от тях просто НЕ Е „истински“ FK в смисъла на SQL!).

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

В работата си Крис Дейт и Хю Даруен описват какво е истинското решение на проблема:множествено възлагане. Това по същество е възможността да се съставят няколко отделни оператора за актуализиране и СУБД да действа спрямо него, сякаш това е един единствен оператор. Реализации на тази концепция наистина съществуват, но няма да намерите такива, които говорят SQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Разбиране на връзката между функциите за класиране, OVER(), GROUP BY?

  2. Обединете стойностите на редовете в CSV (известен още като GROUP_CONCAT за SQL Server)

  3. Възможно ли е да се използва SqlGeography с Linq to Sql?

  4. Най-добрият(ите) индекс(и) за използване за оператор ИЛИ в SQL Server

  5. Обработка на грешки в SQL Server:изключения и договор база данни-клиент