sql >> Base de Datos >  >> RDS >> SQLite

TABLA DE BOTA DE SQLite

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.