【问题标题】:Why cannot delete from a table with reference to another为什么不能参考另一个表从表中删除
【发布时间】:2014-02-18 06:39:45
【问题描述】:

我一直在寻找答案,但也许我错过了一些东西。 我有 2 张桌子,见下文。第一个表中的实体是从第二个表中引用的,但是当我尝试从第二个表中删除时,我得到Error: foreign key mismatch。有触发器(此处未显示),但它们与DELETEcmdauth 无关。我不明白为什么不能删除行?

CREATE TABLE app (name TEXT, script TEXT, PRIMARY KEY(name));
CREATE TABLE env (name TEXT, PRIMARY KEY(name));
CREATE TABLE role (name TEXT, command TEXT, PRIMARY KEY(name,command));

CREATE TABLE cmdauth (groupname TEXT, rolename TEXT, appname TEXT, envname TEXT, FOREIGN KEY (appname) REFERENCES app(name), FOREIGN KEY (rolename) REFERENCES role(name), FOREIGN KEY (envname) REFERENCES env(name), PRIMARY KEY (groupname,rolename,appname,envname));

sqlite> select * from cmdauth where appname='app1' and groupname='admin' and envname='test' and rolename='restarter';
admin|restarter|app1|test
sqlite> delete from cmdauth where appname='app1' and groupname='admin' and envname='test' and rolename='restarter';
Error: foreign key mismatch

感谢您的帮助!

【问题讨论】:

    标签: sql sqlite database-design constraints


    【解决方案1】:

    documentation 说:

    通常,外键约束的父键是父表的主键。如果它们不是主键,则父键列必须共同受制于 UNIQUE 约束或具有 UNIQUE 索引。

    引用role(name)不满足此要求。

    【讨论】:

    • 谢谢,这是我的错。我想知道如何将数据插入cmdauth...也许我还没有用户foreign_keys = ON pragma。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多