В SQLite можете да пуснете таблица с DROP TABLE
изявление.
Можете по желание да добавите IF EXISTS
клауза за потискане на всички грешки, които могат да възникнат, ако таблицата не съществува.
Освен това, ако таблицата е посочена от външен ключ, има няколко неща, които трябва да знаете.
Пример
Ето пример за демонстриране на най-простия начин за пускане на таблица в SQLite:
DROP TABLE t1;
Това премахва таблицата, наречена t1
.
Можете по избор да поставите префикс към името на таблицата с името на схемата.
Използване на IF EXISTS
Клауза
Можете да използвате IF EXISTS
клауза за потискане на всякакви грешки, които могат да възникнат в случай, че таблицата не съществува.
DROP TABLE IF EXISTS t2;
Ако премахнем IF EXISTS
клауза и стартирайте това отново, получаваме грешка.
Пример:
DROP TABLE t2;
Резултат:
Error: no such table: t2
Външен ключ и зависимости за изглед
SQLite не поддържа CASCADE
и RESTRICT
ключови думи, които са включени в SQL стандарта и се поддържат от някои други RDBMS (като PostgreSQL). Тези ключови думи са предназначени да определят какво да се прави, когато целевата таблица има зависимости (като изглед или външен ключ, който препраща към таблицата).
Като се има предвид, че SQLite не поддържа тези ключови думи, ето как SQLite се справя с изгледите и външните ключове, когато се опитате да пуснете таблица.
SQLite игнорира всички зависими изгледи. С други думи, той продължава и пуска таблицата, дори ако има изглед, който я препраща.
Колкото до външните ключове...
Първо, външните ключове са деактивирани по подразбиране в SQLite. Така че освен ако не ги активирате, всички външни ключове, които препращат към целевата таблица, няма да имат влияние върху отпадането на целевата таблица. С други думи, таблицата ще бъде отпаднала.
Ако външните ключове са разрешени във вашата сесия, те ще предотвратят отпадането на таблицата само ако има данни, които ще нарушат този външен ключ. Ако вашата дъщерна таблица не съдържа данни, тогава родителската таблица ще бъде отпаднала без грешка. Ако дъщерната таблица съдържа данни (вероятно включващи данни, които препращат към първичния ключ на родителската таблица), това ще доведе до грешка и таблицата няма да бъде изпусната.
Като това:
PRAGMA foreign_keys = ON;
DROP TABLE t1;
Резултат:
Error: FOREIGN KEY constraint failed
Причината да работи по този начин е, че SQLite изпълнява неявно DELETE FROM
операция, преди да изпуснете масата. Ако DELETE FROM
операцията води до нарушение на външния ключ, тогава получаваме грешката. Но ако няма данни в таблицата, тогава всяко DELETE FROM
операцията няма да доведе до нарушение на външния ключ и таблицата може да бъде отпаднала.
Накратко, това не е DROP TABLE
операция, която причинява нарушения на външния ключ, това е имплицитният DELETE FROM
операция.
Когато външният ключ използва ON DELETE CASCADE
Въпреки това, ако ограничението на външния ключ е дефинирано с ON DELETE CASCADE
, тогава родителската таблица ще бъде премахната и всички редове, които препращат към колоната с първичен ключ на тази таблица, ще бъдат изтрити в дъщерната таблица.
Ето един пример.
Създайте таблици и вмъкнете данни:
CREATE TABLE t11 (
c1 integer PRIMARY KEY AUTOINCREMENT
);
CREATE TABLE t12 (
c1 integer PRIMARY KEY AUTOINCREMENT,
c2 integer REFERENCES t11 (c1) ON DELETE CASCADE
);
INSERT INTO t11 VALUES (1);
INSERT INTO t12 VALUES (1, 1);
Изберете данни:
sqlite> SELECT * FROM t11;
c1
--
1
sqlite> SELECT * FROM t12;
c1 c2
-- --
1 1
Пуснете родителската таблица и прегледайте всички таблици:
sqlite> DROP TABLE t11;
sqlite> .tables
t12
Можем да видим, че t11
вече не съществува, но t12
все още съществува.
Проверете външния ключ на t12
:
sqlite> PRAGMA foreign_key_list(t12);
id seq table from to on_update on_delete match
-- --- ----- ---- -- --------- --------- -----
0 0 t11 c2 c1 NO ACTION CASCADE NONE
Да, това все още съществува и можем да потвърдим, че има ON DELETE CASCADE
.
Изберете данни от t12
:
sqlite> SELECT * FROM t12;
sqlite>
Не се връщат редове. Това е така, защото ON DELETE CASCADE
опция на външния ключ гарантира, че редът е изтрит, когато родителската таблица (t11
) беше премахнат (или по-точно, когато данните му бяха изтрити чрез имплицитното DELETE FROM
операция преди да бъде изпусната).
Изпускане на външен ключ
SQLite всъщност не поддържа премахването на външни ключове. Обикновено в SQL пускате външни ключове с ALTER TABLE
изявление, но ALTER TABLE
на SQLite внедряването не позволява отпадане на ограничения.
Все пак има начин да се справим с тази ситуация. Вижте как да пуснете чужд ключ в SQLite за пример.