【问题标题】:Trouble with composite foreign keys in sqlite3sqlite3中复合外键的问题
【发布时间】:2013-10-29 11:03:30
【问题描述】:

那里!我在 sqlite3 中有一个失败的外键约束,我真的不知道为什么。我正在使用此处描述的复合外键 (http://www.sqlite.org/foreignkeys.html#fk_composite) 和“普通”外键。

这是我的架构:

sqlite> .schema sources
CREATE TABLE sources(
    source_id VARCHAR(16) NOT NULL,
    source_type INTEGER NOT NULL,
    title VARCHAR(128) NOT NULL,
    year INTEGER,
    month INTEGER,
    PRIMARY KEY(source_id),
    UNIQUE(title)
);
sqlite> .schema author_aliases
CREATE TABLE author_aliases(
    author_id INTEGER NOT NULL,
    alias_id INTEGER NOT NULL,
    forenames VARCHAR(128),
    surname VARCHAR(128) NOT NULL,
    PRIMARY KEY(author_id, alias_id),
    FOREIGN KEY(author_id) REFERENCES authors(author_id),
    UNIQUE(forenames, surname)
);
sqlite> .schema alias_source_relations
CREATE TABLE alias_source_relations(
    source_id VARCHAR(16) NOT NULL,
    author_id INTEGER NOT NULL,
    alias_id INTEGER NOT NULL,
    PRIMARY KEY(source_id, author_id, alias_id),
    FOREIGN KEY(source_id) REFERENCES sources(source_id),
    FOREIGN KEY(author_id, alias_id) REFERENCES author_aliases(author_id, alias_id)
);

这是外键所指的数据:

sqlite> SELECT * FROM sources WHERE source_id='Allen1980';
Allen1980|0|The definition of electronegativity and the chemistry of the noble gases|1980|
sqlite> SELECT * FROM author_aliases WHERE author_id=1 and alias_id=1;
1|1|Leland C.|Allen
sqlite> SELECT * FROM authors WHERE author_id=1;
1|Leland Cullen|Allen

这是我的插入:

sqlite> INSERT INTO alias_source_relations VALUES(1, 1, 'Allen1980');
Error: foreign key constraint failed

有人知道我错过了什么吗?感谢您的帮助!

问候, 玛丽安

【问题讨论】:

    标签: sql sqlite foreign-keys


    【解决方案1】:

    检查列顺序!

    INSERT INTO alias_source_relations VALUES('Allen1980', 1, 1);
    

    【讨论】:

    • 谢谢!以正确的顺序插入数据就像魅力一样;-) 我使用 python 脚本插入了大量数据,这些数据以错误的顺序成功。显然 python 脚本无法打开 FOREIGN_KEYS PRAGMA,否则无法插入数据。当我尝试以与 python 脚本相同的顺序手动添加一些数据时,它失败了。我从来没有想过我的 python 脚本设法以错误的顺序插入数据。我真的需要严格检查我的python代码。
    • 我应该删除这个问题吗?我认为从我的愚蠢问题中没有什么值得学习的,是吗?
    • 这不是一个愚蠢的问题,这是一个错误!也许有人,有时会遇到同样的问题,看到这个答案意识到自己的错误。
    【解决方案2】:

    插入值的顺序与表架构中定义的列顺序不匹配。

    包含列名更安全,也更具描述性。像这样,顺序不需要匹配表架构中的一个,并且不知道表架构的人仍然可以理解命令:

    INSERT INTO alias_source_relations (source_id, author_id, alias_id)
        VALUES ('Allen1980', 1, 1);
    

    【讨论】:

      猜你喜欢
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      相关资源
      最近更新 更多