SQLite включва изявление PRAGMA, което ви позволява да проверявате за нарушения на външни ключове в цяла база данни или дадена таблица.
Изявлението е PRAGMA foreign_key_check
, и работи по следния начин.
Синтаксис
Можете да го използвате по един от двата начина:
PRAGMA schema.foreign_key_check;
PRAGMA schema.foreign_key_check(table-name);
Първият ред проверява цялата база данни, докато вторият проверява само конкретна таблица.
Незадължителната schema
аргументът указва името на прикачена база данни или основна или темпер. за основната и ТЕЛК бази данни. Ако schema
е пропуснат,главен се предполага.
Пример
Нека създадем две таблици с връзка между тях.
В този случай Домашни любимци таблицата има външен ключ, който препраща към TypeId колона в Типове таблица.
CREATE TABLE Types(
TypeId INTEGER PRIMARY KEY,
Type
);
CREATE TABLE Pets(
PetId INTEGER PRIMARY KEY,
PetName,
TypeId,
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);
Сега нека въведете данни, които нарушават ограничението за външния ключ.
PRAGMA foreign_keys = OFF;
INSERT INTO Types VALUES
( 1, 'Dog' ),
( 2, 'Cat' );
INSERT INTO Pets VALUES
( 1, 'Homer', 3 );
Вторият INSERT
изявлението нарушава ограничението за външния ключ. Това е така, защото вмъква стойност 3 в Pets.TypeId колона, когато няма съответна стойност в Types.TypeId колона.
Важно нещо, което трябва да се отбележи тук, е, че изрично деактивирах външните ключове, като използвах PRAGMA foreign_keys = OFF
. Това е настройката по подразбиране в SQLite, но исках да уточня за този пример.
Сега нека проверим базата данни за нарушения на външния ключ.
PRAGMA foreign_key_check;
Резултат:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0
Това ни казва, че Домашни любимци таблицата има нарушение на външния ключ на реда с ROWID от 1. Също така ни казва името на родителската таблица, както и идентификатора на външния ключ.
Нека добавим още данни към Домашни любимци таблица и изпълнете проверката отново. Първите два реда се придържат към външния ключ, но последният ред не.
INSERT INTO Pets VALUES
( NULL, 'Yelp', 1 ),
( NULL, 'Fluff', 2 ),
( NULL, 'Brush', 4 );
PRAGMA foreign_key_check;
Резултат:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
Вече имаме два реда, върнати при проверка на цялата база данни за нарушения на външния ключ.
Проверете конкретна таблица
Можете също да посочите таблица, срещу която да стартирате проверката.
Ето пример за пренаписване на предишната проверка, за да посочите само Домашни любимци таблица.
PRAGMA foreign_key_check(Pets);
Резултат:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
Същият резултат.
Ето резултата, ако посоча другата таблица.
PRAGMA foreign_key_check(Types);
Резултат:
(Празно е, защото няма резултати.)
Посочете схема
Както споменахме, можете също да посочите схемата.
PRAGMA main.foreign_key_check(Pets);
Резултат:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
В моя случай използвах основната база данни, но можете да замените main
с името на вашата прикачена база данни.
Как да наложите външни ключове
Както споменахме, SQLite не налага външни ключове, освен ако не посочите изрично, че те трябва да бъдат наложени.
Можете да приложите външни ключове, като използвате PRAGMA foreign_keys = ON
.
Вижте Как да активирате поддръжката на външни ключове в SQLite за повече информация и примери.