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

Създайте връзка в SQL

В SQL създавате връзка, като създавате ограничение за външен ключ.

По-конкретно, имате родителска и дъщерна таблица. Родителят съдържа първичния ключ, а дъщерната таблица съдържа външен ключ, който препраща към първичния ключ на родителската таблица.

Когато използвате SQL за създаване на връзка, можете да създадете връзката в момента, в който създавате таблицата, или можете да я създадете по-късно (като промените таблицата). Тази статия обхваща и двата сценария.

Създайте връзка при създаване на таблицата

Ето пример за създаване на връзка във вашата CREATE TABLE изявление в момента, в който създавате таблицата.

CREATE TABLE Parent (
  ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
  ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  ChildName nvarchar(255) NOT NULL,
  ParentId int NOT NULL
  CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)     
    REFERENCES Parent (ParentId)
);

Тук създадох две таблици; един, наречен Parent а другият се нарича Child .

Създадох връзката в дефиницията на таблицата за дете. Връзката се създава с CONSTRAINT аргумент. Имайте предвид, че това все още е вътре в CREATE TABLE изявление.

Връзката се нуждае от име. В този случай го нарекох FK_Child_Parent . FOREIGN KEY част е последвана от името на колоната (в дъщерната таблица), която ще бъде външният ключ.

REFERENCES част посочва колоната, към която външният ключ ще препраща. В този случай се позовава на ParentId колона на Parent маса. Това се прави с помощта на REFERENCES Parent (ParentId) .

Това е всичко, което е необходимо за създаване на връзката.

Имайте предвид, че примерите на тази страница са направени с помощта на SQL Server. В зависимост от вашата СУБД може да се наложи да промените някои подробности от дефинициите на колоните.

Например IDENTITY е версията на SQL Server на това, което понякога се нарича AUTO_INCREMENT в други СУБД (като MySQL). Ако използвате SQLite, ето как да създадете автоматично увеличаваща се колона в SQLite.

Добавяне на връзка към съществуваща таблица

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

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

CREATE TABLE Parent (
  ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
  ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  ChildName nvarchar(255) NOT NULL,
  ParentId int NOT NULL
);

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

Сега, след като създадохме таблиците, изведнъж си спомняме „о, мамка му, забравих да създам връзка!“.

Няма проблем, сега можем да направим това:

ALTER TABLE Child
  ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)     
    REFERENCES Parent (ParentId);

Свършен. Току-що добавихме връзката, използвайки същите подробности, както в предишния пример.

Имайте предвид, че SQLite не поддържа добавяне на външни ключове с ALTER TABLE изявление. Вижте как да добавите външен ключ към съществуваща таблица в SQLite за повече информация.

При актуализиране/изтриване

По подразбиране връзките на SQL Server се създават с помощта на ON DELETE NO ACTION и ON UPDATE NO ACTION . Следователно предишните примери бяха създадени с помощта на тази настройка.

Въпреки това различните СУБД могат да използват други настройки по подразбиране.

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

ALTER TABLE Child
  ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)     
    REFERENCES Parent (ParentId)
    ON DELETE NO ACTION    
    ON UPDATE NO ACTION;

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

По принцип причината да създадете връзка на първо място е да наложите референтната цялост.

Все пак имате някои опции за това как искате SQL Server да се справи с тези ситуации.

По-конкретно, можете да използвате някоя от следните стойности:

  • NO ACTION :Появява се грешка и действието за изтриване/актуализация на реда в родителската таблица се отменя.
  • CASCADE :Съответните редове се изтриват от/актуализират в таблицата за препратки, ако този ред е изтрит от/актуализиран в родителската таблица.
  • SET NULL :Всички стойности, които съставляват външния ключ, са зададени на NULL ако съответният ред в родителската таблица е изтрит или актуализиран. Това изисква колоните с външен ключ да са нулеви.
  • SET DEFAULT :Всички стойности, които съставляват външния ключ, се задават на техните стойности по подразбиране, ако съответният ред в родителската таблица бъде изтрит или актуализиран. За да се изпълни това ограничение, всички колони с външни ключове трябва да имат дефиниции по подразбиране. Ако колона е нула и няма изрично зададена стойност по подразбиране, 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. Опростяване на модулното тестване на основната съхранена процедура, която също нарича процедура на помощна програма

  2. Намалете обажданията към базата данни, за да подобрите производителността на уебсайта

  3. Основи на табличните изрази, част 1

  4. Как да използвате REPLACE в SQL

  5. Решения за предизвикателство за генератор на числови серии – Част 1