SQLite
 sql >> Baza danych >  >> RDS >> SQLite

TABELA UPUSZCZANIA SQLite

W SQLite możesz upuścić tabelę za pomocą DROP TABLE oświadczenie.

Opcjonalnie możesz dodać IF EXISTS klauzula, aby pominąć wszelkie błędy, które mogą wystąpić, jeśli tabela nie istnieje.

Ponadto, jeśli do tabeli odwołuje się klucz obcy, należy pamiętać o kilku rzeczach.

Przykład

Oto przykład demonstrujący najprostszy sposób upuszczania tabeli w SQLite:

DROP TABLE t1;

Spowoduje to usunięcie tabeli o nazwie t1 .

Możesz opcjonalnie poprzedzić nazwę tabeli nazwą schematu.

Korzystanie z IF EXISTS Klauzula

Możesz użyć IF EXISTS klauzula, aby pominąć wszelkie błędy, które mogą wystąpić w przypadku, gdy tabela nie istnieje.

DROP TABLE IF EXISTS t2;

Jeśli usuniemy IF EXISTS klauzuli i uruchom ją ponownie, pojawi się błąd.

Przykład:

DROP TABLE t2;

Wynik:

Error: no such table: t2 

Zależności klucza obcego i widoku

SQLite nie obsługuje CASCADE i RESTRICT słowa kluczowe, które są zawarte w standardzie SQL i są obsługiwane przez niektóre inne RDBMS (takie jak PostgreSQL). Te słowa kluczowe mają na celu określenie, co zrobić, gdy tabela docelowa ma zależności (takie jak widok lub klucz obcy, który odwołuje się do tabeli).

Biorąc pod uwagę, że SQLite nie obsługuje tych słów kluczowych, oto jak SQLite radzi sobie z widokami i kluczami obcymi podczas próby usunięcia tabeli.

SQLite ignoruje wszelkie zależne widoki. Innymi słowy, idzie naprzód i porzuca tabelę, nawet jeśli istnieje widok, który się do niej odwołuje.

Jeśli chodzi o klucze obce…

Po pierwsze, klucze obce są domyślnie wyłączone w SQLite. Tak więc, o ile ich nie włączysz, wszelkie klucze obce, które odwołują się do tabeli docelowej, nie będą miały wpływu na usuwanie tabeli docelowej. Innymi słowy, tabela zostanie usunięta.

Jeśli klucze obce są włączone w Twojej sesji, zapobiegną one usunięciu tabeli tylko wtedy, gdy istnieją dane, które naruszą ten klucz obcy. Jeśli tabela podrzędna nie zawiera danych, tabela nadrzędna zostanie usunięta bez błędu. Jeśli tabela podrzędna zawiera dane (przypuszczalnie zawierające dane odwołujące się do klucza podstawowego tabeli nadrzędnej), spowoduje to błąd i tabela nie zostanie usunięta.

Tak:

PRAGMA foreign_keys = ON;
DROP TABLE t1;

Wynik:

Error: FOREIGN KEY constraint failed 

Powodem, dla którego działa to w ten sposób, jest to, że SQLite wykonuje niejawne DELETE FROM operacji przed upuszczeniem stołu. Jeśli DELETE FROM operacja powoduje naruszenie klucza obcego, wtedy otrzymujemy błąd. Ale jeśli w tabeli nie ma danych, to każdy DELETE FROM operacja nie spowoduje naruszenia klucza obcego, a tabela może zostać usunięta.

Krótko mówiąc, to nie jest DROP TABLE operacja, która powoduje jakiekolwiek naruszenia klucza obcego, jest to niejawne DELETE FROM operacja.

Kiedy klucz obcy używa ON DELETE CASCADE

Jeśli jednak ograniczenie klucza obcego jest zdefiniowane za pomocą ON DELETE CASCADE , tabela nadrzędna zostanie usunięta, a wszystkie wiersze, które odwołują się do kolumny klucza podstawowego tej tabeli, zostaną usunięte z tabeli podrzędnej.

Oto przykład.

Utwórz tabele i wstawiaj dane:

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);

Wybierz dane:

sqlite> SELECT * FROM t11;
c1
--
1 
sqlite> SELECT * FROM t12;
c1  c2
--  --
1   1 

Upuść tabelę nadrzędną i przejrzyj wszystkie tabele:

sqlite> DROP TABLE t11;
sqlite> .tables
t12

Widzimy, że t11 już nie istnieje, ale t12 nadal istnieje.

Sprawdź klucz obcy na 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 

Tak, to nadal istnieje i możemy potwierdzić, że ma ON DELETE CASCADE .

Wybierz dane z t12 :

sqlite> SELECT * FROM t12;
sqlite> 

Żadne wiersze nie są zwracane. Dzieje się tak, ponieważ ON DELETE CASCADE opcja klucza obcego zapewniała, że ​​​​wiersz został usunięty, gdy tabela nadrzędna (t11 ) został usunięty (a dokładniej, gdy jego dane zostały usunięte za pomocą niejawnego DELETE FROM operacja przed upuszczeniem).

Upuszczanie klucza obcego

SQLite w rzeczywistości nie obsługuje upuszczania kluczy obcych. Zwykle w SQL upuszczasz klucze obce za pomocą ALTER TABLE instrukcja, ale ALTER TABLE SQLite implementacja nie pozwala na usuwanie ograniczeń.

Jest jednak sposób na poradzenie sobie z tą sytuacją. Zobacz Jak usunąć klucz obcy w SQLite na przykład.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Android - zaktualizuj bazę danych sqlite klienta za pomocą GCM

  2. Jak działa Typeof() w SQLite

  3. Jak korzystać z polecenia zrzutu SQLite

  4. Aktualizacja wstępnie wypełnionej bazy danych

  5. Logcat mówi niepoprawne dane kolumny 1