2011-07-27 4 views
9

아래 스크립트를 실행할 때 왜 SQLite "외래 키 불일치가"이 발생합니까? 내가 SQLite는 확실하지 않다SQLite 외래 키 불일치 오류

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]) 
    ) 

답변

4

:

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]) 
    ) 

및 참조 된 테이블 :

DELETE 
FROM rlsconfig 
WHERE importer_config_id=2 and 
program_mode_config_id=1 

여기에 기본 테이블 정의입니다. 하지만 Google에서이 링크를 발견했습니다. http://www.sqlite.org/foreignkeys.html. 이유 중 일부는 부모 테이블이 존재하지 않는

  • , 또는
  • 존재하지 않는 외래 키 제약에 이름이 부모 키 열, 또는
  • 외국에 이름이 부모 키 열이 될 수 있습니다 키 제약 조건은 부모 테이블의 기본 키가 아니며 CREATE TABLE에 지정된 조합 시퀀스를 사용하여 고유 제한 조건의 영향을받지 않습니다.
  • 하위 테이블은 기본 키 열을 지정하지 않고 부모의 기본 키를 참조합니다. 상위 키의 기본 키 열 수가 하위 키의 수와 일치하지 않습니다. 키 열.
31

복합 기본 키가있는 테이블에서 외래 키를 사용하는 경우 참조 된 테이블의 기본 키에있는 모든 필드와 복합 외래 키를 사용해야합니다.

는 예 :

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

불행하게도, SQLite는 외부 키 제약 조건이 실패한 언급하지 않고이 오류 모든 시간을 제공합니다. 하나씩 점검하고, 종종 작동하지 않는 것을 확인한 다음, 제한 조건없이 테이블을 다시 작성하고 문제점을 찾을 때까지 하나씩 다시 추가하십시오. SQLite는 많은면에서 훌륭하지만 이것은 그 중 하나가 아닙니다.