SQL:更新时如何判断和跳过唯一约束?
Posted
技术标签:
【中文标题】SQL:更新时如何判断和跳过唯一约束?【英文标题】:SQL: How to determine and skip the unique constraint when doing update? 【发布时间】:2013-01-23 18:27:54 【问题描述】:我正在编写一个 SQL (Oracle) 来使用另一个表中的值更新一个表。但由于有 2 列唯一约束,更新总是失败。是这样的:
Table A
- A_1
- A_2
- A_3
(There is a unique constraint for A_1 + A_3 )
Table B
- B_1
- B_2
这是我当前的sql:
UPDATE A a
SET a.A_1 =
(SELECT b.B_1
FROM B b
WHERE a.A_2 = b.B_2
)
AND EXISTS
(SELECT b.B_1
FROM B b
WHERE a.a.A_2 = b.B_2
)
我想跳过违反唯一约束的行,但我不知道该怎么做。请指教。谢谢!
【问题讨论】:
【参考方案1】:您可以在末尾添加一个AND NOT EXISTS
,将约束值与新值进行对比(更新后也是如此):
...
AND NOT EXISTS
(
SELECT 1
FROM A checkA
WHERE checkA.A_1 = (SELECT b.B_1 FROM B b WHERE a.A_2 = b.B_2)
AND checkA.A_3 = a.A_3
)
【讨论】:
感谢您的回答。我明白了。我现在正在尝试。但是我看到了运行时间过长的问题。 B 表很大。你有什么改进的想法吗?谢谢! 请原谅我的天真,但我会先看看为什么您要进行更新但任意忽略行,因为它们会失败约束。在我的书中,它会失败的事实说明你首先做错了什么...... 你的观点对我来说也很有意义。这实际上是从一个表到另一个表的数据回填。 B表是一个将数据转发到A表的中间件。现在我们将它合并到 A 表中。由于我们在 A 中添加了一些不经过 B 的新特性,因此 A 和 B 之间可能存在一些冲突数据。这是我们新特性的缺陷造成的。我们现在要忽略它。 明白了。我想不出任何能让它更快的方法,但您可以检查EXPLAIN
的输出,看看是否有帮助。
可以检查B(B_2,B_1)上是否有索引以上是关于SQL:更新时如何判断和跳过唯一约束?的主要内容,如果未能解决你的问题,请参考以下文章