Външен ключ на SQL Server: Как да го създадете с пример

⚡ Умно обобщение

Външен ключ в SQL Server налага референтна цялост, като свързва дъщерна таблица с родителска таблица. Всяка стойност на външен ключ трябва вече да съществува в посочения първичен ключ на родителската таблица.

  • 🔗 Какво е външен ключ: Външен ключ свързва дъщерна таблица с родителска таблица и налага референтна цялост между тях.
  • 👪 Родител и дете: Реферираната таблица е родителската таблица; таблицата, съдържаща външния ключ, е детето, което сочи към първичния ключ на родителя.
  • 🖱️ Два метода за създаване: Взаимоотношенията в SQL Server Management Studio и клаузата T-SQL CREATE TABLE … FOREIGN KEY … REFERENCES дефинират външен ключ.
  • ➕ Добавяне към съществуваща таблица: ALTER TABLE … ADD CONSTRAINT … FOREIGN KEY добавя релацията към таблица, която вече съществува.
  • 🔄 Референтни действия: Клаузите ON DELETE и ON UPDATE контролират дъщерните редове с NO ACTION, CASCADE, SET NULL или SET DEFAULT.
  • ✅ Integrity проверете: Вмъкването на дъщерен ред, чийто ключ няма съответстващ родителски ред, се отхвърля, keeping данните са последователни.

ВЪНШЕН КЛЮЧ НА SQL Server: Как да създадете в SQL Server с пример

Какво е FOREIGN KEY?

Външният ключ предоставя начин за налагане на референтна цялост вътре SQL ServerС прости думи, външният ключ гарантира, че стойностите в една таблица трябва да присъстват и в друга таблица.

Правила за FOREIGN KEY

  • NULL е разрешено във външен ключ на SQL.
  • Таблицата, към която се прави препратка, се нарича родителска таблица.
  • Таблицата с външния ключ се нарича дъщерна таблица.
  • Външният ключ в дъщерната таблица препраща към първичен ключ в родителската таблица.
  • Тази връзка родител-дете налага правилото, известно като „референтна цялост“.

Диаграмата по-долу обобщава всички точки по-горе за външния ключ.

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

Как да създадете FOREIGN KEY в SQL

Можете да създадете външен ключ в SQL Server по два начина:

Студио за управление на SQL Server

Родителска таблица: Да кажем, че имаме съществуваща родителска таблица с име „Курс“. Course_ID и Course_name са две колони, като Course_Id е първичен ключ.

Родителска таблица Course с първичен ключ Course_Id и колони Course_name

Дъщерна таблица: Трябва да създадем втората таблица като дъщерна таблица. „Course_ID“ и „Course_Strength“ са двете ѝ колони. „Course_ID“ обаче ще бъде външният ключ.

Стъпка 1) Щракнете с десния бутон върху Таблици > Нова > Таблица…

Щракнете с десния бутон върху Таблици, след това върху Ново, след това върху Таблица в SQL Server Management Studio

Стъпка 2) Въведете две имена на колони като „Course_Id“ и „Course_Strength“. Щракнете с десния бутон върху колоната „Course_Id“, след което щракнете върху Relationship.

Нови колони в дъщерна таблица Course_ID и Course_Strength с менюто Relationship

Стъпка 3) В „Връзки с външен ключ“ щракнете върху „Добавяне“.

Диалогов прозорец „Връзки между външни ключове“ с бутона „Добавяне“

Стъпка 4) В „Спецификация на таблици и колони“ щракнете върху иконата „…“.

Поле „Спецификация на таблици и колони“ с бутона с многоточие

Стъпка 5) Изберете „Таблица с първични ключове“ като „КУРС“ и новата таблица, която се създава, като „Таблица с външни ключове“ от падащото меню.

Избиране на COURSE като таблица с първични ключове в диалоговия прозорец за релации

Стъпка 6) За „Таблица с първични ключове“ изберете колоната „Course_Id“ като колона на таблицата с първични ключове.

За „Таблица с външни ключове“ изберете колоната „Course_Id“ като колона на таблицата с външни ключове. Щракнете върху OK.

Картаping Course_Id като колони с първичен ключ и външен ключ

Стъпка 7) Кликнете върху Добавяне.

Щракване върху „Добавяне“, за да потвърдите връзката с външния ключ

Стъпка 8) Дайте име на таблицата като „Course_Strength“ и щракнете върху OK.

Именуване на дъщерната таблица Course_Strength и щракване върху OK

Резултат: Зададохме връзка родител-дете между „Course“ и „Course_Strength“.

Установена е връзка родител-дете между Course и Course_Strength

T-SQL: Създаване на таблица родител-дете с помощта на T-SQL

Родителска таблица: Преосмислете факта, че имаме съществуваща родителска таблица с име „Курс“. Course_ID и Course_name са две колони, като Course_Id е първичен ключ.

Съществуваща родителска таблица Course с Course_Id като първичен ключ

Дъщерна таблица: Трябва да създадем втората таблица като дъщерна таблица с име „Course_Strength_TSQL“. „Course_ID“ и „Course_Strength“ са двете ѝ колони. „Course_ID“ обаче ще бъде външният ключ.

По-долу е синтаксисът на създайте таблица с ВЪНШЕН КЛЮЧ.

Синтаксис:

CREATE TABLE childTable
(
  column_1 datatype [ NULL |NOT NULL ],
  column_2 datatype [ NULL |NOT NULL ],
  ...

  CONSTRAINT fkey_name
    FOREIGN KEY (child_column1, child_column2, ... child_column_n)
    REFERENCES parentTable (parent_column1, parent_column2, ... parent_column_n)
    [ ON DELETE { NO ACTION |CASCADE |SET NULL |SET DEFAULT } ]
    [ ON UPDATE { NO ACTION |CASCADE |SET NULL |SET DEFAULT } ] 
);

Ето описание на горните параметри:

  • childTable е името на таблицата, която трябва да бъде създадена.
  • колона_1, колона_2 са колоните, които ще бъдат добавени към таблицата.
  • fkey_name е името на ограничението на външния ключ, което ще бъде създадено.
  • child_column1, child_column2 … child_column_n са колоните на дъщерната таблица, които препращат към първичния ключ в parentTable.
  • parentTable е името на родителската таблица, чийто ключ е посочен в дъщерната таблица.
  • parent_column1, parent_column2 … parent_column_n са колоните, съставляващи първичния ключ на родителската таблица.
  • ON DELETE е незадължителен параметър, който указва какво се случва с дъщерните данни след изтриване на родителските данни. Стойностите включват NO ACTION, SET NULL, CASCADE или SET DEFAULT.
  • ON UPDATE е незадължителен параметър, който указва какво се случва с дъщерните данни след актуализиране на родителските данни. Стойностите включват NO ACTION, SET NULL, CASCADE или SET DEFAULT.
  • „БЕЗ ДЕЙСТВИЕ“ означава, че нищо не се случва с дъщерните данни, след като родителските данни бъдат актуализирани или изтрити.
  • CASCADE означава, че дъщерните данни се изтриват или актуализират, след като родителските данни са били изтрити или актуализирани.
  • SET NULL означава, че дъщерните данни се задават на null, след като родителските данни бъдат актуализирани или изтрити.
  • ЗАДАВАНЕ ПО СТАНДАРТНО означава, че дъщерните данни се задават на стойността си по подразбиране след актуализация или изтриване на родителските данни.

Нека видим пример за външен ключ, който създава таблица с една колона като ВЪНШЕН КЛЮЧ, използвайки тип данни за всяка колона.

Външен ключ в SQL пример

Запитване:

CREATE TABLE Course_Strength_TSQL
(
Course_ID Int,
Course_Strength Varchar(20) 
CONSTRAINT FK FOREIGN KEY (Course_ID)
REFERENCES COURSE (Course_ID)	
)

Стъпка 1) Изпълнете заявката, като щракнете върху Изпълни.

Изпълнение на заявката CREATE TABLE, която дефинира външния ключ Course_ID

Резултат: Зададохме връзка родител-дете между „Course“ и „Course_Strength_TSQL“.

Създадена е връзка родител-дете между Course и Course_Strength_TSQL

Използване на ALTER TABLE

Сега ще научим как да добавим външен ключ в SQL Server към таблица, която вече съществува, използвайки командата ALTER TABLE. Ще използваме синтаксиса, даден по-долу:

ALTER TABLE childTable
ADD CONSTRAINT fkey_name
    FOREIGN KEY (child_column1, child_column2, ... child_column_n)
    REFERENCES parentTable (parent_column1, parent_column2, ... parent_column_n);

Ето описание на параметрите, използвани по-горе:

  • childTable е името на таблицата, която трябва да бъде създадена.
  • колона_1, колона_2 са колоните, които ще бъдат добавени към таблицата.
  • fkey_name е името на ограничението на външния ключ, което ще бъде създадено.
  • child_column1, child_column2 … child_column_n са колоните на дъщерната таблица, които препращат към първичния ключ в parentTable.
  • parentTable е името на родителската таблица, чийто ключ е посочен в дъщерната таблица.
  • parent_column1, parent_column2 … parent_column_n са колоните, съставляващи първичния ключ на родителската таблица.

Пример за добавяне на външен ключ при ALTER TABLE:

ALTER TABLE department
ADD CONSTRAINT fkey_student_admission
    FOREIGN KEY (admission)
    REFERENCES students (admission);

Създадохме външен ключ с име fkey_student_admission в таблицата на отдела. Този външен ключ препраща към колоната за прием на таблицата на учениците.

Примерна заявка FOREIGN KEY

Първо, нека видим данните от нашата родителска таблица, РАЗБИРА СЕ.

Запитване:

SELECT * from COURSE;

Резултат от SELECT, показващ данните от родителската таблица COURSE

Сега нека вмъкнем няколко реда в дъщерната таблица „Course_Strength_TSQL“. Ще се опитаме да вмъкнем два типа редове:

  • Първият тип, за който Course_Id в дъщерната таблица съществува в Course_Id на родителската таблица, т.е. Course_Id = 1 и 2.
  • Вторият тип, за който Course_Id в дъщерната таблица не съществува в Course_Id на родителската таблица, т.е. Course_Id = 5.

Запитване:

Insert into COURSE_STRENGTH values (1,'SQL');
Insert into COURSE_STRENGTH values (2,'Python');
Insert into COURSE_STRENGTH values (5,'PERL');

Вмъкване на дъщерни редове, включително Course_ID 5, който няма съответстващ родителски ред

Резултат: Нека изпълним заявката заедно, за да видим родителските и дъщерните таблици.

Редовете с Course_ID 1 и 2 съществуват в таблицата Course_Strength. Course_ID 5 обаче е изключение, защото няма съответстващ ред в родителската таблица.

Сравнени са родителски и дъщерни таблици; Course_ID 5 нарушава референтната цялост

Въпроси и Отговори

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

Да. Външен ключ може да препраща или към първичен ключ, или към всяка колона, която носи ограничение UNIQUE в родителската таблица. Препратената колона трябва да съдържа уникални стойности, така че всеки дъщерен ред да съвпада точно с един родителски ред.

ON DELETE CASCADE автоматично изтрива съответстващите дъщерни редове, когато родителският им ред бъде изтрит.ping таблиците са последователни. Алтернативите са SET NULL, което изчиства външния ключ на дъщерния елемент, и NO ACTION, което блокира изтриването.

Да. Самореферентен външен ключ сочи към първичен ключ в същата таблица, който моделира йерархии, като например ред на служител, препращащ към неговия мениджър. За самореферентни връзки SQL Server препоръчва ON DELETE NO ACTION, за да се избегнат каскадни цикли.

Да, освен ако колоната не е декларирана като NOT NULL. NULL външен ключ означава, че дъщерният ред все още не е свързан с никой родителски ред и SQL Server пропуска проверката за референции за тази NULL стойност.

Изпълнете командата ALTER TABLE child_table DROP CONSTRAINT fkey_name. Трябва да предоставите името на ограничението, което можете да намерите в sys.foreign_keys. Dropping Външният ключ премахва връзката, но оставя и двете таблици, както и техните данни, непроменени.

Да. Копилот на GitHub може да пише ограничения FOREIGN KEY в оператори CREATE TABLE или ALTER TABLE от подкана на естествен език и да предлага родителската таблица и посочената колона. Винаги преглеждайте ключовете, референтните действия и типовете данни, преди да изпълните скрипта.

Инструментите с изкуствен интелект и машинно обучение изследват примерни данни и модели на заявки, за да предложат кои колони трябва да станат външни ключове, да открият липсващи или осиротели връзки и да препоръчат подходящи действия ON DELETE. Разработчикът преглежда всяко предложение, преди да го приложи.

Обобщете тази публикация с: