Sql-Server-2014

如何更正 MS SQL 2014 中的主鍵欄位

  • April 15, 2020

我有一個使用序列號作為數據庫主鍵的表。我們有一些序列號的錯誤導入,其中在欄位的開頭包含了一個撇號。

我試圖使用語句刪除它

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創建了一個虛擬場景,向您展示它是如何工作的。

創建表

create table xxx (keynumber nvarchar(10) primary key clustered, comment nvarchar(20)) 

插入偽數據

insert into xxx (keynumber,comment) 
values 
('12345','First Comment'), 
('''12345','Second Comment'), 
('12346','Third Comment'), 
('''12346','Fourth Comment'),
('123457','Fith Comment')

選擇偽重複

SELECT x1.keynumber, x2.keynumber 
FROM [xxx].[dbo].[xxx] as x1 
    JOIN [xxx].[dbo].[xxx] as x2
    ON '''' + x1.keynumber = x2.keynumber

結果

鑰匙號碼 | 鍵號
:-------- | :--------
12345 | '12345 
12346 | '12346 

然後,您可以刪除重複項或重命名它們(請參閱替代項)

清理完重複項後,您將能夠執行UPDATE.... 在此之前,您有一些體力勞動要做。

替代/重命名

不只是刪除撇號,而是向具有撇號的值添加一個附加值keynumber。例如添加CHKkeynumber

UPDATE [xxx].[dbo].[xxx] 
SET [xxx].[dbo].[xxx].[keynumber] = replace([xxx].[dbo].[xxx].[keyNumber], '''','CHK')

這樣,您將能夠看到必須檢查哪些值。

觀察

如果該列keynumber是一個int,那麼就不可能進入'12345該表。

引用自:https://dba.stackexchange.com/questions/264970