【问题标题】:Does SQLite3 not support foreign key constraints?SQLite3 不支持外键约束吗?
【发布时间】:2012-04-13 19:52:24
【问题描述】:

我对 SQLITE3 有疑问。

我使用以下 SQL 脚本创建了 2 个表 personsorders

sqlite> create table Persons(
            P_Id int primary key,
            LastName varchar,
            FirstName varchar,
            Address varchar,
            City varchar
        );

sqlite> create table Orders(
            O_Id int NOT NULL,
            OrderNo int NOT NULL,
            P_Id int, 
            PRIMARY KEY (O_Id),
            FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
        );

sqlite> insert into Orders values(1,77895,3);

sqlite> select * from Orders;

1|77895|3

sqlite>

即使persons 表是空行也可以插入orders 表中。

它没有显示任何错误。

这怎么可能。

【问题讨论】:

    标签: sql database sqlite


    【解决方案1】:

    其他答案未提及的一个重要注意事项是启用/禁用外部约束检查的命令如下:

    PRAGMA foreign_keys = ON;
    

    在已启动的事务中无效。这是documentation的引述:

    此编译指示是事务中的空操作;外键约束 只有在没有待处理的情况下才能启用或禁用强制执行 开始或保存点。

    该命令应该在事务开始之前运行。当我尝试暂时禁用 FK 约束检查以解决性能问题时遇到了这个问题,但是如果在不适当的时间使用该命令,这可能仍然会导致问题。

    【讨论】:

      【解决方案2】:

      在 SQLite 3.x 中,您必须每次连接到 SQLite 数据库时进行以下查询:

      PRAGMA foreign_keys = ON;
      

      否则 SQLite 将忽略所有外键约束。

      为什么每次?根据documentation,向后兼容 SQLite 2.x。

      在 SQLite 4.x 中,FK 约束将是 enabled by default

      【讨论】:

      • 每次?不能永久启用吗?
      • @mafu 是的,每次。我已经编辑了答案以解释原因。
      • 今天刚碰到这个。这是最愚蠢的事情。
      【解决方案3】:

      SQLite Foreign Key Support

      sqlite> PRAGMA foreign_keys = ON;
      

      这将启用外键约束。

      【讨论】:

        【解决方案4】:

        您阅读过文档吗? main page 表示它是在 3.6.19 版本中引入的。 link 展示了如何使用外键(你的代码是正确的)。

        您的代码是否给出了您忽略的任何错误消息?您是否检查了文档中指定的所有先决条件?

        【讨论】:

        • 那么请告诉我如何删除旧版本并安装新版本的 sqlite3。
        • @AbbasMulani 如何卸载和安装取决于你的操作系统和其他东西。检查当前安装的版本以及安装方式。安装新版本的步骤并不大。
        【解决方案5】:

        检查您的 SQLite 中是否启用了外键约束:http://sqlite.org/foreignkeys.html#fk_enable

        【讨论】:

        • 当我输入命令 PRAGMA foreign_key 时它没有显示任何内容;
        猜你喜欢
        • 1970-01-01
        • 2013-03-04
        • 1970-01-01
        • 2022-12-22
        • 2011-09-11
        • 2016-11-08
        • 2019-07-15
        • 1970-01-01
        相关资源
        最近更新 更多