【问题标题】:oracle sql - update unless update will duplicate on uniqueoracle sql - 更新,除非更新将重复唯一
【发布时间】:2014-10-03 04:09:59
【问题描述】:

我正在使用用户表并将用户名字段更改为用户名||'test' 不幸的是,在此过程中,已经有转换后的用户名与此相同。由于 userName 有一个唯一的约束,我需要一种方法来更新这些字段,除非它们会导致重复。我一直在网上到处寻找帮助,到目前为止只找到了一个通用的“使您的更新不会导致重复”,而没有更多关于如何使用 oracle 来做到这一点。

表: 主 varchar 唯一 varchar user_id 名称用户名

需要将所有用户名更新为 userName = userName || 'test' 除非用户名||'test' 已经存在。

有什么建议吗?

【问题讨论】:

  • 如果 userName||'test' 已经存在,你会怎么做 - 使用不同的模式,还是保留 userName 原样?你看过not exists 测试吗?
  • 如果 userName||'test' 已经存在,它应该将其更改为 userName||'duplicate',这样我就可以在清理之前返回并手动检查。
  • 如果您还是要手动清理,那么您不妨使用 guildbounty 的答案;然后在运行后,寻找username not like '%test' 而不是like '%duplicate' 的任何地方。

标签: sql sql-update duplicates oracle-sqldeveloper


【解决方案1】:

假设 userName 当前是不同的,并且没有预先存在的重复项要处理...

UPDATE UserTable ut1
SET userName = userName || 'test'
WHERE NOT EXISTS(
    SELECT 1
    FROM UserTable ut2
    WHERE ut2.userName LIKE ut1.userName || 'test'
)

我将添加一个关于 NOT EXISTS 子句的警告声明。它可以非常迅速地进入可怕的性能领域。它很有用,但应谨慎使用。

【讨论】:

  • 我试了一下,仍然导致 ORA-00001 唯一约束错误。我用过.. UPDATE users SET userName = userName ||'test' WHERE NOT EXISTS (SELECT 1 FROM users u2 WHERE userName LIKE userName || 'test' ) AND userName NOT LIKE '%test';
  • 用户名是主键吗?我无法真正破译您在上面的表格描述。如果是这样,我可以想到两个可能仍然会给您带来麻烦的选项。
  • user_id 是主键。对不起,堆栈格式仍然是新的。显然,硬输入不等于换行。
  • 好的,userName 是否附加了唯一约束?我假设是的,但这在您的表定义中不可见
  • 我对我的答案做了一个小的更新,我意识到我忘记了表格上的别名...用别名再试一次。
猜你喜欢
  • 2022-12-06
  • 1970-01-01
  • 2019-03-08
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 2021-12-09
相关资源
最近更新 更多