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

Ограничението за външен ключ в дъщерна таблица позволява вмъкване на стойности, които не съществуват в родителската таблица

Първо, имаме практическото причини. Външните ключове се поддържат и проверяват с помощта на индекси. За да може един индекс да бъде използваем, трябва да знаем (търсените) стойности на всички колони в индекса. Ако имаме индекс/pk на (a,b) и имаме стойност на външен ключ (NULL,1) , не можем да търсим в рамките на индекса, за да се определи дали има някакъв ред с b стойност 1. Това би направило външния ключ "скъп" за поддръжка.

Но второ, трябва да вземем предвид последователността. За случая с една колона това е доста безспорно - ако имате стойност в колоната FK, тогава трябва да има съответстваща стойност в колоната, към която се отнася. В противен случай, ако колоната FK е NULL тогава ограничението не е отметнато.

Но как да разширим това до множество колони? Какво е правилото по-горе? Няма единствен очевидно тълкуване, но вместо това множество. Дали горното правило „ако всички колоните не са NULL, тогава ограничението се проверява" или "ако някакво колоните не са NULL, тогава ограничението се проверява"? Тези правила са идентични, когато се разглежда само една колона.

Очаквахте правилото да е второто, а всъщност е първото. Това е изрично документирано :



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получите списък с налични SQL сървъри с помощта на C# код?

  2. Разпределена транзакция на свързан сървър между sql сървър и mysql

  3. Мога ли да използвам променлива, когато използвам ISABOUT?

  4. Как да поправя проблема с квалификатора на вградения текст, докато експортирате данни в CSV плосък файл?

  5. SQL операторът IF се игнорира