En SQLite, puede soltar una tabla con DROP TABLE
declaración.
Opcionalmente, puede agregar el IF EXISTS
cláusula para suprimir cualquier error que pueda ocurrir si la tabla no existe.
Además, si una clave externa hace referencia a la tabla, hay algunas cosas que debe tener en cuenta.
Ejemplo
Aquí hay un ejemplo para demostrar la forma más sencilla de colocar una tabla en SQLite:
DROP TABLE t1;
Esto elimina la tabla llamada t1
.
Opcionalmente, puede prefijar el nombre de la tabla con el nombre del esquema.
Usando el IF EXISTS
Cláusula
Puedes usar el IF EXISTS
cláusula para suprimir cualquier error que pueda ocurrir en caso de que la tabla no exista.
DROP TABLE IF EXISTS t2;
Si eliminamos el IF EXISTS
y lo ejecutamos de nuevo, obtenemos un error.
Ejemplo:
DROP TABLE t2;
Resultado:
Error: no such table: t2
Clave externa y dependencias de vista
SQLite no es compatible con CASCADE
y RESTRICT
palabras clave, que se incluyen en el estándar SQL y son compatibles con algunos otros RDBMS (como PostgreSQL). Estas palabras clave están diseñadas para especificar qué hacer cuando la tabla de destino tiene dependencias (como una vista o una clave externa que hace referencia a la tabla).
Dado que SQLite no admite estas palabras clave, así es como SQLite trata las vistas y las claves externas cuando intenta eliminar una tabla.
SQLite ignora cualquier vista dependiente. En otras palabras, continúa y descarta la tabla, incluso si hay una vista que hace referencia a ella.
En cuanto a las claves foráneas...
Primero, las claves foráneas están deshabilitadas por defecto en SQLite. Por lo tanto, a menos que las habilite, cualquier clave externa que haga referencia a la tabla de destino no tendrá ningún impacto en la eliminación de la tabla de destino. En otras palabras, la tabla se descartará.
Si las claves externas están habilitadas en su sesión, solo evitarán la eliminación de la tabla si hay datos que violarán esa clave externa. Si su tabla secundaria no contiene datos, la tabla principal se eliminará sin errores. Si la tabla secundaria contiene datos (presumiblemente incluidos datos que hacen referencia a la clave principal de la tabla principal), se generará un error y la tabla no se eliminará.
Así:
PRAGMA foreign_keys = ON;
DROP TABLE t1;
Resultado:
Error: FOREIGN KEY constraint failed
La razón por la que funciona así es porque SQLite realiza un DELETE FROM
implícito operación antes de dejar caer la mesa. Si DELETE FROM
la operación da como resultado una violación de clave externa, entonces obtenemos el error. Pero si no hay datos en la tabla, cualquier DELETE FROM
La operación no dará como resultado una violación de clave externa y la tabla se puede descartar.
En resumen, no es la DROP TABLE
operación que causa cualquier violación de clave externa, es el implícito DELETE FROM
operación.
Cuando la clave externa usa ON DELETE CASCADE
Sin embargo, si la restricción de clave externa se define con ON DELETE CASCADE
, la tabla principal se eliminará y todas las filas que hagan referencia a la columna de clave principal de esa tabla se eliminarán en la tabla secundaria.
He aquí un ejemplo.
Crear tablas e insertar datos:
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);
Seleccionar datos:
sqlite> SELECT * FROM t11;
c1
--
1
sqlite> SELECT * FROM t12;
c1 c2
-- --
1 1
Suelta la tabla principal y revisa todas las tablas:
sqlite> DROP TABLE t11;
sqlite> .tables
t12
Podemos ver que t11
ya no existe, pero t12
todavía existe.
Compruebe la clave externa en 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
Sí, todavía existe, y podemos confirmar que tiene ON DELETE CASCADE
.
Seleccionar datos de t12
:
sqlite> SELECT * FROM t12;
sqlite>
No se devuelven filas. Esto se debe a que ON DELETE CASCADE
La opción en la clave externa aseguró que la fila se eliminó cuando la tabla principal (t11
) se eliminó (o más precisamente, cuando sus datos se eliminaron a través de DELETE FROM
implícito operación antes de ser soltado).
Dejar caer una clave externa
SQLite en realidad no admite la eliminación de claves externas. Normalmente en SQL sueltas claves foráneas con ALTER TABLE
declaración, pero ALTER TABLE
de SQLite la implementación no permite descartar restricciones.
Sin embargo, hay una manera de lidiar con esta situación. Consulte Cómo soltar una clave externa en SQLite para ver un ejemplo.