Tengo la siguiente tabla:
CREATE TABLE child(
id INTEGER PRIMARY KEY,
parent_id INTEGER,
description TEXT);
¿Cómo agrego una restricción de clave externa parent_id
? Suponga que las claves externas están habilitadas.
La mayoría de los ejemplos asumen que está creando la tabla; me gustaría agregar la restricción a una existente.
sql
sqlite
foreign-keys
ddl
Dane O'Connor
fuente
fuente
Respuestas:
No puedes
Aunque la sintaxis SQL-92 para agregar una clave foránea a su tabla sería la siguiente:
SQLite no admite la
ADD CONSTRAINT
variante delALTER TABLE
comando ( sqlite.org: características de SQL que SQLite no implementa ).Por lo tanto, la única forma de agregar una clave foránea en sqlite 3.6.1 es durante
CREATE TABLE
lo siguiente:Desafortunadamente, tendrá que guardar los datos existentes en una tabla temporal, descartar la tabla anterior, crear la nueva tabla con la restricción FK y luego copiar los datos nuevamente desde la tabla temporal. ( sqlite.org - Preguntas frecuentes: P11 )
fuente
RENAME TO
es una de las pocasALTER TABLE
variantes que actualmente se admite en sqlite 3.Puede agregar la restricción si modifica la tabla y agrega la columna que usa la restricción.
Primero, cree una tabla sin parent_id:
Luego, alter table:
fuente
Por favor, consulte https://www.sqlite.org/lang_altertable.html#otheralter
fuente
Sí, puede, sin agregar una nueva columna. Debe tener cuidado de hacerlo correctamente para evitar corromper la base de datos, por lo que debe hacer una copia de seguridad completa de la base de datos antes de intentarlo.
para su ejemplo específico:
o más generalmente:
De cualquier manera, es probable que desee ver primero cuál es la definición de SQL antes de realizar cambios:
Si usa el enfoque replace (), puede que le resulte útil, antes de ejecutar, probar primero el comando replace () ejecutando:
fuente
Si está utilizando el complemento sqlite-manager de Firefox, puede hacer lo siguiente:
En lugar de soltar y crear la tabla nuevamente, uno puede modificarla así.
En el cuadro de texto Columnas, haga clic con el botón derecho en el último nombre de columna de la lista para que aparezca el menú contextual y seleccione Editar columna. Tenga en cuenta que si la última columna en la definición de TABLA es la CLAVE PRIMARIA, primero será necesario agregar una nueva columna y luego editar el tipo de columna de la nueva columna para agregar la definición de CLAVE EXTRANJERA. Dentro del cuadro Tipo de columna, agregue una coma y el
definición después del tipo de datos. Haga clic en el botón Cambiar y luego haga clic en el botón Sí en el cuadro de diálogo Operación peligrosa.
Referencia: Sqlite Manager
fuente
Puedes probar esto:
fuente
Básicamente no puedes pero puedes pasar por alto la situación.
La forma correcta de agregar la restricción de clave externa a una tabla existente es el siguiente comando.
Luego copie los datos parent_Id a newCol y luego elimine la columna Parent_Id . Por lo tanto, no hay necesidad de una tabla temporal.
fuente
Primero agregue una columna en la tabla secundaria
Cid
comoint
luegoalter table
con el código a continuación. De esta manera, puede agregar la clave externaCid
como la clave principal de la tabla primaria y usarla como clave externa en la tabla secundaria ... espero que lo ayude, ya que es bueno para mí:fuente