2011-07-27 30 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はこのエラーに外部キー制約が失敗した言及せずにすべての時間を与えます。それらを1つ1つチェックするように残されています。これはしばしばうまくいかず、制約のないテーブルを再構築し、問題が見つかるまで1つずつ戻します。 SQLiteは多くの点で優れていますが、これはその1つではありません。

関連する問題