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

Може ли външният ключ да бъде NULL и/или дублиран?

Кратък отговор:Да, може да бъде NULL или дублиран.

Искам да обясня защо външният ключ може да трябва да бъде нулев или може да трябва да бъде уникален или неуникален. Първо запомнете, че външният ключ просто изисква стойността в това поле да съществува първо в друга таблица (родителската таблица). Това е всичко, което FK е по дефиниция. Null по дефиниция не е стойност. Null означава, че все още не знаем каква е стойността.

Нека ви дам пример от реалния живот. Да предположим, че имате база данни, която съхранява предложения за продажби. Да предположим, че всяко предложение има само един търговец и един клиент. Така че вашата таблица с предложения ще има два външни ключа, един с идентификатора на клиента и един с идентификатора на търговския представител. Въпреки това, в момента на създаване на записа, търговски представител не винаги е назначен (тъй като все още никой не е свободен да работи върху него), така че идентификационният номер на клиента се попълва, но идентификаторът на търговския представител може да е нулев. С други думи, обикновено имате нужда от възможността да имате нулев FK, когато може да не знаете стойността му в момента на въвеждане на данните, но знаете други стойности в таблицата, които трябва да бъдат въведени. За да разрешите нулеви стойности във FK, обикновено всичко, което трябва да направите, е да разрешите nulls в полето, което има FK. Нулевата стойност е отделна от идеята, че е FK.

Дали е уникална или не уникална се отнася до това дали таблицата има връзка едно-едно или едно-много с родителската таблица. Сега, ако имате връзка един-един, е възможно да имате всички данни в една таблица, но ако таблицата става твърде широка или ако данните са по различна тема (примерът на служителя - осигуряване @tbone даде например), тогава искате отделни таблици с FK. Тогава бихте искали да направите този FK или също PK (което гарантира уникалност), или да поставите уникално ограничение върху него.

Повечето FK са за връзка един към много и това е, което получавате от FK, без да добавяте допълнително ограничение на полето. Така че имате таблица за поръчки и таблица с подробности за поръчката например. Ако клиентът поръча десет артикула наведнъж, той има една поръчка и десет подробни записа за поръчка, които съдържат същия идентификатор на поръчка като FK.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Да се ​​изтрие ли един запис от Entity Framework?

  2. Добавете стойност по подразбиране на полето за дата и час в SQL Server към времева марка

  3. Колоните за дата в SQL-Server (MSSQL-JDBC 3.0), работещи под Java 1.7.0, извлечени като 2 дни в миналото

  4. Може ли таблица на sql сървър да има две колони за идентичност?

  5. Sql сървър - свържете се с удостоверяване на Windows