我有一个使用序列号作为数据库主键的表。我们有一些序列号的错误导入,其中在字段的开头包含了一个撇号。
我试图使用语句删除它
update [xxx].[dbo].[xxx] set [xxx].[dbo].[xxx].[keynumber] = replace([xxx].[dbo].[xxx].[keyNumber], '''','')
当我这样做时,我收到以下错误:
Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'xxx$PrimaryKey'. Cannot insert duplicate key in object 'dbo.xxx'. The duplicate key value is (123456789).
有没有办法可以更新此字段并删除单个撇号而不违反约束?
我们需要表定义才能得到明确的答案。看起来当您从序列号中删除单个撇号时,该值与已经存在的值相同。因此出现错误消息。
看起来导入文件已更正并再次导入,导致多个值包含例如类似于
12345
和的值'12345
。解决方案
我会先尝试搜索几乎相同的主键,看看是否可以删除它们。
我用db<>fiddle创建了一个虚拟场景,向您展示它是如何工作的。
创建表
插入伪数据
选择伪重复
结果
然后,您可以删除重复项或重命名它们(请参阅替代项)
清理完重复项后,您将能够运行
UPDATE...
. 在此之前,您有一些体力劳动要做。替代/重命名
不只是删除撇号,而是向具有撇号的值添加一个附加值
keynumber
。例如添加CHK
到keynumber
这样,您将能够看到必须检查哪些值。
观察
如果该列
keynumber
是一个int
,那么就不可能进入'12345
该表。