当前位置: 首页 > 知识库问答 >
问题:

SQL更新列并忽略重复的键错误

仲涵亮
2023-03-14

我希望用同一行中其他列的相关值更新列。我正在更新的列是唯一的,如果执行此操作,我有时会出现重复的键错误。我希望忽略这些错误,只更新其中一条记录,忽略其他记录。

我的查询如下所示:

update [Table] set Coolname = lower(Fname) + lower(Lname)
where Coolname like '%s' 
and staticID=1995
and Fname is not null 
and Lname is not null

现在,在Fname和Lname两行匹配的情况下,我只希望更新第一个记录Coolname。

谢谢(MS SQL Server)

共有2个答案

华泽语
2023-03-14

您应该能够使用几个CTE:

;With CoolNames as (
    select *,lower(Fname) + lower(Lname) as NewCoolName from Table
    where Coolname like '%s' 
    and staticID=1995
    and Fname is not null 
    and Lname is not null
), Ordered as (
    select *,ROW_NUMBER() OVER (PARTITION BY NewCoolName ORDER BY staticID) as rn
    from Coolnames cn
)
UPDATE Ordered SET CoolName = NewCoolName where rn = 1

其中,由于您不关心哪个被选择用于更新,我选择了ORDER BY静态ID-我碰巧知道所有行都是一样的,所以这真的会让服务器任意选择一个进行更新。

如果冲突正在发生,而不是像您在问题中提到的那样,发生在有资格更新的两行之间,而是发生在有资格更新的一行和已经设置了CoolName的现有行之间,然后添加

WHERE NOT EXISTS(select * from Table t where t.CoolName = cn.CoolName)

进入有序的CTE。

邢永安
2023-03-14

像这样的怎么样:

UPDATE[Table] 
SET Coolname = lower(Fname) + lower(Lname)
WHERE 'PRIMARY_KEY' IN 
    (SELECT top 1 'PRIMARY_KEY' FROM [Table] 
        WHERE Coolname LIKE'%s' 
        AND staticID=1995
        AND Fname IS NOT NULL 
        AND Lname IS NOT NULL );

没有SQL Server方面的经验,所以查询应该只是一个提示。。。希望我没弄错。

 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : “ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY UPDATE” (11个答案) 6年前关闭。 我正在尝试完成此查询;我的标签字段设置为UNIQUE,我只是希望数据库忽略任何重复的标签。 甚至可以接受 问题答案: 建议不要使用INSERT IGNORE,因为它会忽略所有错误(即,草率的全局忽略)。相反,由于在您的示例中

  • 我目前使用JOOQ的可更新记录如下模式插入: 在,我希望使用数据库中的值更新,例如,如果表具有自动递增的列,将返回其值。 如果列具有唯一约束,则当违反该约束时,将抛出。我的问题是可以告诉JOOQ不要抛出异常,但仍然用现有的值更新记录吗?

  • 我在ansible中有一个playbook,它可以从一个存储库中安装包含无效密钥的软件包: 但ansible无法更新缓存: 即使选项或选项设置为yes。如何用这些关键问题更新缓存? EDIT再现此行为的命令是: 但我可以继续发布命令 并在警告后安装软件包。Ansible正在考虑上面的警告(),这是Cloudera方面的一个错误,提供了错误的密钥或错误的签名存储库,但继续安装包: 因此,我试图实现的

  • 问题内容: 当将insert_many与pymongo一起使用时,我需要忽略重复的插入,其中重复是基于索引的。我已经看到有关stackoverflow的问题,但是我没有看到有用的答案。 这是我的代码段: 我希望insert_many忽略重复项而不抛出异常(这会填满我的错误日志)。另外,是否可以使用一个单独的异常处理程序,这样我就可以忽略这些错误。我想念“ w = 0” … 谢谢 问题答案: 您可以

  • 我的例子如下: Person是一个简单的实体,有3个字段“Long id、String name、intger age”,并且映射到相应的Person表,上面有3列) 有没有办法通过使用@Query 重要的 请帮帮忙。

  • 作为开发人员,我使用以下endpoint:https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/batchUpdate 并要求:https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#AppendCells