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.