通常在SQLite中标识导致约束冲突的rowid

时间:2018-11-25 13:53:55

标签: sql postgresql sqlite constraints check-constraints

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

我需要此工具来生成SQL语句,因此我不能将其绑定到具有特定表的特定用例。

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

因此,我可以从INSERT中学到的是它已失败。现在,我怎么知道哪一行打破了插入?

说明:

我需要一个使用SQL语句/表达式的解决方案,即我无法在其周围编写非SQL代码。

在SQLite中无法使用时出现的奖励问题:

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

用例示例

以下是将使用此功能的示例(请参见第二个示例和结尾处指向该问题的注释):https://stackoverflow.com/a/53461201/43615

1 个答案:

答案 0 :(得分:0)

即使从理论上讲也是不可能的。

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

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

如果有一种方法可以根据行ID找出行所在的,则我不知道它是什么,因此拥有原始行ID可能用处不大

最后,在SQLite中行ID是可选的;您可以使用WITHOUT ROWID用行ID列创建一个表。