Ошибка несоответствия внешнего ключа SQLite - PullRequest
14 голосов
/ 27 июля 2011

Почему я получаю SQLite « несоответствие внешнего ключа » при выполнении сценария ниже?

DELETE 
FROM rlsconfig 
WHERE importer_config_id=2 and 
program_mode_config_id=1

Вот определение основной таблицы:

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

и ссылочная таблица:

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

Ответы [ 3 ]

38 голосов
/ 25 сентября 2011

Когда вы используете внешний ключ над таблицей, которая имеет составной первичный ключ, вы должны использовать составной внешний ключ со всеми полями, которые находятся в первичном ключе ссылочной таблицы.

Пример:

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 )
);
10 голосов
/ 27 июля 2011

Я не уверен насчет SQLite. Но я нашел эту ссылку в Google. http://www.sqlite.org/foreignkeys.html. Некоторые из причин могут быть

  • Родительская таблица не существует или
  • Столбцы родительского ключа, названные в ограничении внешнего ключа, не существуют, или
  • Столбцы родительского ключа, названные в ограничении внешнего ключа, не являются первичным ключом родительской таблицы и не подчиняются уникальному ограничению с использованием последовательности сортировки, указанной в CREATE TABLE, или
  • Дочерняя таблица ссылается на первичный ключ родительского элемента без указания столбцов первичного ключа, а количество столбцов первичного ключа в родительском элементе не соответствует количеству столбцов дочернего ключа.
4 голосов
/ 01 августа 2013

К сожалению, SQLite постоянно выдает эту ошибку, не упоминая, ЧТО не удалось выполнить ограничение внешнего ключа. Вам остается попытаться проверить их одну за другой, что часто не работает, а затем перестроить таблицу без ограничений и добавить их одну за другой, пока не найдете проблему. SQLite хорош во многих отношениях, но это не один из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...