首页 > 解决方案 > 在 SQLite 中一般识别导致约束冲突的 rowid

问题描述

INSERT OR IGNORE我需要在语句之后识别导致约束检查失败的行。

我需要一个生成 SQL 语句的工具,所以我不能将它与特定表的特定用例联系起来。

这里的挑战是我不知道为我将插入的特定表设置了哪些约束。它可能有外键或UNIQUE约束,甚至CHECK附加了一个子句。

所以,我能从 INSERT 中学到的只是它失败了。现在,我如何判断哪一行破坏了插入?

澄清:

我需要一个使用 SQL 语句/表达式的解决方案,即我不能围绕它编写非 SQL 代码。

如果在 SQLite 中不可能的话,还有一个额外的问题:

这可以在 Postgresql 或 MySQL 中完成吗?

示例用例

这是一个使用此功能的示例(请参阅第二个示例和最后指向此问题的注释):https ://stackoverflow.com/a/53461201/43615

标签: sqlpostgresqlsqliteconstraintscheck-constraints

解决方案


这即使在理论上也是不可能的。

并非所有约束失败都涉及插入行之外的数据。例如,CHECK 约束通常不会。在这种情况下,将没有要报告的行 ID。

INSERT 可能会使应用于其他表中不同行的多个约束失败。你会对哪一个感兴趣?

如果有办法根据行 ID 找出一行所在的,我不知道它是什么,所以拥有原始行 ID 可能没有多大用处。

最后,行 ID 在 SQLite 中是可选的;您可以使用创建具有行 id 列的表WITHOUT ROWID


推荐阅读