Câu hỏi Lỗi không phù hợp khóa ngoài của SQLite


Tại sao tôi nhận được một SQLite "khóa ngoại không khớp"lỗi khi thực thi tập lệnh bên dưới?

DELETE 
FROM rlsconfig 
WHERE importer_config_id=2 and 
program_mode_config_id=1

Đây là định nghĩa bảng chính:

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

và bảng tham chiếu:

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

13
2017-07-27 17:26


gốc




Các câu trả lời:


Khi bạn sử dụng khóa ngoài trên bảng có khóa chính kết hợp, bạn phải sử dụng khóa ngoài tổng hợp với tất cả các trường nằm trong khóa chính của bảng được tham chiếu.

Thí dụ:

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

33
2017-09-24 22:49





Tôi không chắc chắn về SQLite. Nhưng tôi tìm thấy liên kết này trên google. http://www.sqlite.org/foreignkeys.html. Một số lý do có thể là

  • Bảng cha không tồn tại hoặc
  • Các cột khóa chính được đặt tên trong ràng buộc khóa ngoài không tồn tại hoặc
  • Các cột khóa chính được đặt tên trong ràng buộc khóa ngoài không phải là khóa chính của bảng cha và không phải chịu ràng buộc duy nhất bằng cách sử dụng chuỗi đối chiếu được chỉ định trong CREATE TABLE hoặc
  • Bảng con tham chiếu khóa chính của phụ huynh mà không chỉ định các cột khóa chính và số cột khóa chính trong phụ huynh không khớp với số cột khóa con.

8
2017-07-27 17:43





Thật không may, SQLite cung cấp cho lỗi này tất cả thời gian mà không đề cập đến hạn chế khóa ngoại mà không thành công. Bạn còn lại để thử kiểm tra từng cái một, thường không hoạt động, và sau đó xây dựng lại bảng mà không có các ràng buộc và thêm chúng lại từng cái một cho đến khi bạn tìm thấy vấn đề. SQLite là rất tốt trong rất nhiều cách, nhưng đây không phải là một trong số họ.


2
2017-08-01 10:57