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

SQLite DROP TABLE

В 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 за пример.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java ,Правилно използване на статични променливи за предотвратяване на застой - Синхронизиране

  2. Не може да се актуализира ред в Sqlite в Android, но не се появява грешка

  3. Настройте вашите Avg() резултати в SQLite с ключовата дума DISTINCT

  4. Извадете години от дата в SQLite

  5. Close никога не е бил извикан изрично в базата данни