Когато създавате таблица в SQLite, можете също да създадете външен ключ, за да установите връзка с друга таблица.
Тази статия предоставя пример за създаване на външен ключ при създаване на таблица в SQLite.
Активиране на поддръжка на външни ключове
Първото нещо, което трябва да направим, е да активираме поддръжката на външни ключове (ако това все още не е направено).
Ако приемем, че вашата библиотека SQLite не е е компилиран с SQLITE_OMIT_FOREIGN_KEY
или SQLITE_OMIT_TRIGGER
дефиниран, все пак ще трябва да активирате поддръжка на външни ключове по време на изпълнение.
За да направите това, изпълнете следния оператор:
PRAGMA foreign_keys = ON;
Това ще позволи налагането на външни ключове за връзката с вашата база данни.
Ако отворите друга връзка, ще трябва да изпълните същото изявление за тази връзка.
Имайте предвид, че тази настройка не е необходима за създаване външни ключове, но е необходимо за налагане външни ключове.
След като активирахме поддръжката на външни ключове, нека да продължим и да създадем външен ключ.
Пример
Представете си, че искаме две таблици със следните данни.
Таблица, наречена Домашни любимци :
PetId PetName TypeId ---------- ---------- ---------- 1 Brush 3 2 Tweet 3 3 Yelp 1 4 Woofer 1 5 Fluff 2
Таблица, наречена Тип s:
TypeId Type ---------- ---------- 1 Dog 2 Cat 3 Parakeet 4 Hamster
И ние искаме TypeId колона на Домашни любимци таблица за справка с TypeId колона от Типове маса.
С други думи, искаме да направим Pets.TypeId дъщерния ключ (с ограничение за външен ключ) и Types.TypeId родителския ключ (с ограничение на първичен ключ).
Докато родителските ключове обикновено са и основният ключ за таблицата, това всъщност не е изискване. В този пример ще го направим първичен ключ.
Можем да използваме следния код, за да създадем тези две таблици.
CREATE TABLE Types(
TypeId INTEGER PRIMARY KEY,
Type
);
CREATE TABLE Pets(
PetId INTEGER PRIMARY KEY,
PetName,
TypeId,
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);
Частта, която създава външния ключ, е следната:
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
FOREIGN KEY(TypeId)
част декларира Pets.TypeId като външен ключ.
Въпреки че не определих името на колоната с името на таблицата, знаем, че е Pets.TypeId (а не Types.TypeId ), защото изпълняваме това в CREATE TABLE
изявление за Домашни любимци .
REFERENCES Types(TypeId)
определя колоната, която нашият външен ключ ще препраща. В този случай той ще препраща към TypeId колона от Типове таблица.
Сега, когато нашите таблици са създадени с подходящия външен ключ, можем да добавяме данни.
INSERT INTO Types VALUES
( NULL, 'Dog' ),
( NULL, 'Cat' ),
( NULL, 'Parakeet' ),
( NULL, 'Hamster' );
INSERT INTO Pets VALUES
( NULL, 'Brush', 3 ),
( NULL, 'Tweet', 3 ),
( NULL, 'Yelp', 1 ),
( NULL, 'Woofer', 1 ),
( NULL, 'Fluff', 2 );
Таблиците вече съдържат данните, показани по-горе.
sqlite> SELECT * FROM Pets;
PetId PetName TypeId
---------- ---------- ----------
1 Brush 3
2 Tweet 3
3 Yelp 1
4 Woofer 1
5 Fluff 2
sqlite> SELECT * FROM Types;
TypeId Type
---------- ----------
1 Dog
2 Cat
3 Parakeet
4 Hamster
Нарушение на външния ключ
Но сега нека опитаме да вмъкнем данни, които нарушават външния ключ.
Нека се опитаме да добавим домашен любимец, който използва несъществуващ TypeID (т.е. TypeId стойност, която не съществува в Типове колона).
INSERT INTO Pets VALUES
( NULL, 'Homer', 5 );
Резултат:
Error: FOREIGN KEY constraint failed
Така нашият външен ключ успешно предотврати навлизането на лоши данни в базата данни. Следователно това ни помогна да поддържаме целостта на данните.
Ако не получите тази грешка и данните са били вмъкнати успешно, не сте активирали поддръжката на външни ключове. Както споменахме, ще трябва да активирате поддръжката на външни ключове, преди външните ви ключове да бъдат наложени.
Добавяне на външен ключ към съществуваща таблица
ALTER TABLE
изразът в SQLite е много ограничен и не позволява добавяне на външен ключ към съществуваща таблица.
Следователно, ако трябва да добавите външен ключ към съществуваща таблица, ще трябва да пуснете таблицата и да я създадете отново с ограничението за външен ключ.
Ако таблицата съдържа данни, които искате да запазите, можете да прехвърлите тези данни в друга таблица, преди да ги прехвърлите обратно, след като създадете новата таблица с ограничението на външния ключ.