sql - 在 SQLite 中一般识别导致约束冲突的 rowid
问题描述
INSERT OR IGNORE
我需要在语句之后识别导致约束检查失败的行。
我需要一个生成 SQL 语句的工具,所以我不能将它与特定表的特定用例联系起来。
这里的挑战是我不知道为我将插入的特定表设置了哪些约束。它可能有外键或UNIQUE
约束,甚至CHECK
附加了一个子句。
所以,我能从 INSERT 中学到的只是它失败了。现在,我如何判断哪一行破坏了插入?
澄清:
我需要一个使用 SQL 语句/表达式的解决方案,即我不能围绕它编写非 SQL 代码。
如果在 SQLite 中不可能的话,还有一个额外的问题:
这可以在 Postgresql 或 MySQL 中完成吗?
示例用例
这是一个使用此功能的示例(请参阅第二个示例和最后指向此问题的注释):https ://stackoverflow.com/a/53461201/43615
解决方案
这即使在理论上也是不可能的。
并非所有约束失败都涉及插入行之外的数据。例如,CHECK 约束通常不会。在这种情况下,将没有要报告的行 ID。
INSERT 可能会使应用于其他表中不同行的多个约束失败。你会对哪一个感兴趣?
如果有办法根据行 ID 找出一行所在的表,我不知道它是什么,所以拥有原始行 ID 可能没有多大用处。
最后,行 ID 在 SQLite 中是可选的;您可以使用创建具有行 id 列的表WITHOUT ROWID
。
推荐阅读
- reactjs - 为什么 React 将对象视为字符串?
- r - 无效的图形状态模型 4you
- python - 加快读取压缩 bz2 文件('rb' 模式)
- css - CSS显示绝对在假设备框架后面
- linux - 在 centos 8 上安装 OpenCV
- scala - 由于 InvalidPath 异常,无法使用“sbt 控制台”启动 Scala REPL
- python - 带标记的线图在终点
- node.js - ReferenceError:未定义传输器
- java - 如何将 Activity 传递给 ViewModel?
- vue.js - 如何更改道具值以在 VueJS 的上下文中关闭 vs-popup