SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

SQLite DROP TABLE


No SQLite, você pode descartar uma tabela com o DROP TABLE demonstração.

Você pode adicionar opcionalmente o IF EXISTS cláusula para suprimir quaisquer erros que possam ocorrer se a tabela não existir.

Além disso, se a tabela for referenciada por uma chave estrangeira, há algumas coisas a serem observadas.

Exemplo


Aqui está um exemplo para demonstrar a maneira mais simples de descartar uma tabela no SQLite:
DROP TABLE t1;

Isso descarta a tabela chamada t1 .

Opcionalmente, você pode prefixar o nome da tabela com o nome do esquema.

Usando o IF EXISTS Cláusula


Você pode usar o IF EXISTS cláusula para suprimir quaisquer erros que possam ocorrer no caso de a tabela não existir.
DROP TABLE IF EXISTS t2;

Se removermos o IF EXISTS cláusula e executá-la novamente, recebemos um erro.

Exemplo:
DROP TABLE t2;

Resultado:
Error: no such table: t2 

Chave estrangeira e dependências de visualização


SQLite não suporta o CASCADE e RESTRICT palavras-chave, que estão incluídas no padrão SQL e são suportadas por alguns outros RDBMSs (como PostgreSQL). Essas palavras-chave são projetadas para especificar o que fazer quando a tabela de destino tem dependências (como uma visão ou chave estrangeira que faz referência à tabela).

Dado que o SQLite não suporta essas palavras-chave, veja como o SQLite lida com visualizações e chaves estrangeiras quando você tenta descartar uma tabela.

O SQLite ignora quaisquer visualizações dependentes. Em outras palavras, ele vai em frente e descarta a tabela, mesmo que haja uma visão que faça referência a ela.

Quanto às chaves estrangeiras…

Primeiro, as chaves estrangeiras são desabilitadas por padrão no SQLite. Portanto, a menos que você as habilite, quaisquer chaves estrangeiras que façam referência à tabela de destino não terão impacto na eliminação da tabela de destino. Em outras palavras, a tabela será descartada.

Se as chaves estrangeiras estiverem habilitadas em sua sessão, elas só impedirão a eliminação da tabela se houver dados que violem essa chave estrangeira. Se sua tabela filha não contiver dados, a tabela pai será eliminada sem erros. Se a tabela filha contiver dados (presumivelmente incluindo dados que fazem referência à chave primária da tabela pai), isso resultará em um erro e a tabela não será descartada.

Assim:
PRAGMA foreign_keys = ON;
DROP TABLE t1;

Resultado:
Error: FOREIGN KEY constraint failed 

A razão pela qual funciona assim é porque o SQLite executa um DELETE FROM implícito operação antes de largar a mesa. Se o DELETE FROM operação resulta em uma violação de chave estrangeira, então obtemos o erro. Mas se não houver dados na tabela, então qualquer DELETE FROM operação não resultará em uma violação de chave estrangeira e a tabela pode ser descartada.

Resumindo, não é o DROP TABLE operação que causa qualquer violação de chave estrangeira, é o DELETE FROM implícito Operação.

Quando a chave estrangeira usa ON DELETE CASCADE


No entanto, se a restrição de chave estrangeira for definida com ON DELETE CASCADE , a tabela pai será descartada e todas as linhas que fizerem referência à coluna de chave primária dessa tabela serão excluídas da tabela filho.

Aqui está um exemplo.

Crie tabelas e insira dados:
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);

Selecione os dados:
sqlite> SELECT * FROM t11;
c1
--
1 
sqlite> SELECT * FROM t12;
c1  c2
--  --
1   1 

Elimine a tabela pai e revise todas as tabelas:
sqlite> DROP TABLE t11;
sqlite> .tables
t12

Podemos ver que t11 não existe mais, mas t12 ainda existe.

Verifique a chave estrangeira em 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 

Sim, isso ainda existe, e podemos confirmar que tem ON DELETE CASCADE .

Selecione dados de t12 :
sqlite> SELECT * FROM t12;
sqlite> 

Nenhuma linha é retornada. Isso ocorre porque o ON DELETE CASCADE opção na chave estrangeira garantiu que a linha fosse excluída quando a tabela pai (t11 ) foi descartado (ou mais precisamente, quando seus dados foram excluídos via DELETE FROM implícito> operação antes de ser descartado).

Descartando uma chave estrangeira


Na verdade, o SQLite não suporta a eliminação de chaves estrangeiras. Normalmente no SQL você descarta chaves estrangeiras com o ALTER TABLE instrução, mas ALTER TABLE do SQLite implementação não permite a eliminação de restrições.

Há uma maneira de lidar com esta situação embora. Consulte Como descartar uma chave estrangeira no SQLite para obter um exemplo.