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:更新时如何判断和跳过唯一约束?的主要内容,如果未能解决你的问题,请参考以下文章

SQL中如何设置唯一性约束

SQL 如何在update 时保证唯一性?

如何查找给定列是不是存在唯一键约束

mysql唯一约束

通过实体框架更新时如何绕过唯一键约束(使用 dbcontext.SaveChanges())

如何更新 postgreSQL 唯一键约束