【问题标题】:SQL: duplicate key value violates unique constraint PGS-220000SQL:重复键值违反唯一约束 PGS-220000
【发布时间】:2022-09-28 01:16:59
【问题描述】:

有没有办法对不违反键的任何记录执行 sql 更新。

UPDATE NmsSubscription SET iRecipientId  = 13251076 WHERE iRecipientId  = 13250626\";  

26/09/2022 15:54:44 js15 WDB-200001 SQL 语句 \'UPDATE NmsSubscription SET iRecipientId = 13251076 其中 iRecipientId = 13250626\' 无法执行。 26/09/2022 15:54:44 js15 PGS-220000 PostgreSQL 错误:错误:重复键值违反唯一性 约束 \"nmssubscription_subscription\" DETAIL: Key (iserviceid, irecipientid)=(3218161, 13251076) 已经存在。 .

在这个表中,我成功更新了 10 条记录,但是用户已经注册了一个服务,因此出现了错误,对任何不存在的记录执行更新的最佳方法是什么?

用户订阅13250626

用户订阅13251076

我想将所有订阅从收件人 13250626 分配给收件人 13251076,后者尚未订阅。

此外,我正在尝试计算订阅收件人 13251076 未注册到该收件人 13250626 但我没有得到正确的结果。

SELECT COUNT(*) FROM NmsSubscription WHERE iRecipientId = 13250626 AND NOT EXISTS (SELECT * FROM NmsSubscription WHERE iRecipientId = 13251076)\'
  • AND NOT EXISTS (SELECT 1 from NmsSubscription where RecipiendIT=newId)。不要在列名中使用存储类型前缀,自 2000 年以来这被认为是一个丑陋的错误。如果从 int 变为 long 或 serial,为什么要更改列名?数据没有改变。关系没有改变
  • 如果我使用 select * UPDATE NmsSubscription SET iRecipientId = 13251076 WHERE iRecipientId = 13250626 AND NOT EXISTS (SELECT * FROM NmsSubscription WHERE iRecipientId = 13251076) 有区别吗

标签: sql postgresql


【解决方案1】:

诚然,我有点不清楚您为什么要进行这些更新的性质,但是如果您要更新记录,但由于 PK 约束已经存在的记录除外,那么您可以使用反连接从更新中删除这些记录(不存在)子句:

UPDATE NmsSubscription a
SET iRecipientId = 13251076
WHERE iRecipientId  = 13250626
and not exists (
  select null
  from NmsSubscription b
  where
    a.iserviceid = b.iserviceid and
    b.iRecipientId = 13251076
)

使用参数可能更容易阅读:

UPDATE NmsSubscription a
SET iRecipientId = :NEW_VALUE
WHERE iRecipientId  = :OLD_VALUE
and not exists (
  select null
  from NmsSubscription b
  where
    a.iserviceid = b.iserviceid and
    b.iRecipientId = :NEW_VALUE
)

【讨论】:

    猜你喜欢
    • 2020-05-03
    • 1970-01-01
    • 2022-01-13
    • 2020-03-27
    • 2013-06-23
    • 2016-06-12
    • 2013-03-15
    • 2016-11-27
    • 2018-03-14
    相关资源
    最近更新 更多