2011-07-27 15 views
9

¿Por qué me aparece un error SQLite "error de coincidencia de clave externa" al ejecutar el script a continuación?Error de discrepancia de clave externa SQLite

DELETE 
FROM rlsconfig 
WHERE importer_config_id=2 and 
program_mode_config_id=1 

Aquí es principal definición de tabla:

CREATE TABLE [RLSConfig] (
     "rlsconfig_id"  integer PRIMARY KEY AUTOINCREMENT NOT NULL, 
     "importer_config_id"  integer NOT NULL, 
     "program_mode_config_id"  integer NOT NULL, 
     "l2_channel_config_id"  integer NOT NULL, 
     "rls_fixed_width"  integer NOT NULL 
    , 
     FOREIGN KEY ([importer_config_id]) 
      REFERENCES [ImporterConfig]([importer_config_id]), 
     FOREIGN KEY ([program_mode_config_id]) 
      REFERENCES [ImporterConfig]([importer_config_id]), 
     FOREIGN KEY ([importer_config_id]) 
      REFERENCES [ImporterConfig]([program_mode_config_id]), 
     FOREIGN KEY ([program_mode_config_id]) 
      REFERENCES [ImporterConfig]([program_mode_config_id]) 
    ) 

y tabla de referencia:

CREATE TABLE [ImporterConfig] (
     "importer_config_id"  integer NOT NULL, 
     "program_mode_config_id"  integer NOT NULL, 
     "selected"  integer NOT NULL DEFAULT 0, 
     "combined_config_id"  integer NOT NULL, 
     "description"  varchar(50) NOT NULL COLLATE NOCASE, 
     "date_created"  datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), 
     PRIMARY KEY ([program_mode_config_id], [importer_config_id]) 
    , 
     FOREIGN KEY ([program_mode_config_id]) 
      REFERENCES [ProgramModeConfig]([program_mode_config_id]) 
    ) 

Respuesta

4

No estoy seguro acerca de SQLite. Pero encontré este enlace en google. http://www.sqlite.org/foreignkeys.html. Algunas de las razones puede ser

  • La tabla primaria no existe, o
  • Las columnas de clave primaria llamada en la restricción de clave externa no existen, o
  • Las columnas de clave primaria llamada en el extranjero la restricción clave no es la clave principal de la tabla padre y no están sujetas a una restricción única usando la secuencia de clasificación especificada en CREATE TABLE, o
  • La tabla secundaria hace referencia a la clave principal del elemento primario sin especificar las columnas de la clave principal y el número de columnas de clave principal en el padre no coincide con el número de hijos columnas clave
31

Cuando utiliza una clave externa sobre una tabla que tiene una clave primaria compuesta, debe usar una clave externa compuesta con todos los campos que están en la clave principal de la tabla referenciada.

Ejemplo:

CREATE TABLE IF NOT EXISTS parents 
(
    key1 INTEGER NOT NULL, 
    key2 INTEGER NOT NULL, 
    not_key INTEGER DEFAULT 0, 

    PRIMARY KEY (key1, key2) 
); 


CREATE TABLE IF NOT EXISTS childs 
(
    child_key INTEGER NOT NULL, 
    parentKey1 INTEGER NOT NULL, 
    parentKey2 INTEGER NOT NULL, 
    some_data INTEGER, 

    PRIMARY KEY (child_key), 
    FOREIGN KEY (parentKey1, parentKey2) REFERENCES parents(key1, key2) 
); 
3

Desafortunadamente, SQLite da este error todo el tiempo, sin mencionar QUE restricción de clave externa falló. Tendrá que intentar verificarlos uno por uno, lo que a menudo no funciona, y luego reconstruir la tabla sin las restricciones y volver a agregarlas una por una hasta que encuentre el problema. SQLite es genial en muchos sentidos, pero este no es uno de ellos.

Cuestiones relacionadas