检查外键约束违规

时间:2018-06-16 23:14:58

标签: database sqlite foreign-keys

在SQLite外键中默认禁用,因此我们可能会在表中意外插入违反外键约束的行。 在此之后我们可以通过启用外键 PRAGMA foreign_keys=on  并想要检查所有 我们表中的行满足相应的约束。 怎么做?

2 个答案:

答案 0 :(得分:2)

foreign_key_check编译指示会显示违规行为。

https://www.sqlite.org/pragma.html#pragma_foreign_key_check

答案 1 :(得分:0)

如果您打算使用外键,则应在建立连接时启用外键。

但是,以下演示了一种使用NOT IN确定无效引用的方法: -

DROP TABLE IF EXISTS main_table;
DROP TABLE IF EXISTS user_table;
CREATE TABLE IF NOT EXISTS main_table (
    id INTEGER PRIMARY KEY, 
    user_reference INTEGER -- WOULD/COULD have REFERENCES usertable (id)
);
CREATE TABLE IF NOT EXISTS user_table (
    id INTEGER PRIMARY KEY, -- REFERENCED column
    user_name TEXT
);
INSERT INTO user_table VALUES
    (null,'Fred'),
    (null,'Bert'),
    (null,'Tom')
;
INSERT INTO main_table VALUES
    (null,1), -- References FRED (most likely)
    (null,'not a valid reference'), -- oooops this will not reference a user
    (null,2)
;
SELECT * FROM main_table 
    WHERE user_reference 
    NOT IN (
        SELECT id FROM user_table
        )
;

结果是: -

enter image description here

如果您只是想要一个指示,那么如果没有无效的引用或无效引用的数量(例如,当应用于上述时为1),则以下将返回0: -

SELECT count() FROM main_table
    WHERE user_reference
    NOT IN (
            SELECT id FROM user_table
        )
;