sql server「鍵列信息不足或不正確。更新影響到多行」

環境:windows server 2003 sp2,sql server 2000,用於管理固定資產的軟件。html

故障現象:sql

        要同時增長兩臺思科交換機的固定資產信息,因爲型號什麼都一致,只是序列號不同。因而就想作完一臺後,可否直接複製一條單據過來改一下不一致的地方就好了。可是前臺沒法實現。本着偷懶和學習的態度,殺到後臺,直接打開數據庫操做。 去了主鍵限制,用下面語句複製:數據庫

INSERT INTO da111

SELECT *

FROM da111

WHERE (scodel = '03-ne-076')

複製完後,在結果列表中找到新複製的行,直接手動修改主鍵ID,想讓兩條語句有所區別。此時,只要鼠標點擊此行之外其餘地方,就提示「鍵列信息不足或不正確。更新影響到多行」,以下:windows

wKioL1hg3nOSX-RLAAAmjoDUtgQ650.jpg

比較崩潰的是,無論是再重裝改回原來的ID值(還原成兩行如出一轍),或者用刪除語句刪除重複,都會彈出如上警告,只有從右上角整個關閉查詢分析器窗口,才能進行其餘的操做。安全

緣由分析:ide

       無論是用語句,仍是用鼠標直接在表格裏選中修改,其實都是update。對數據庫來講,此時等因而對兩條如出一轍的行進行修改,對SQL SERVER來是不容許的。因此就會有如上提示。學習

       那麼對ORACLE來講會不會由於有ROWID的存在,就容許看上去如出一轍的行修改呢?晚點測試一下。測試

解決方法:spa

    知道緣由,解決辦法就好找了。3d

    方法1.刪除全部的重複行,從新手動一條條作!注意,須要關閉窗口從新打開查詢分析器窗口來運行語句:

DELETE FROM da111_bak2   --也能夠直接用delete da111_bak2,不加from

WHERE (scodel = '03-ne-076')

檢查表相關性的時候,能夠用如下窗口來檢查。可是隻能檢查過程、觸發器之類的,若是是被別的表引用,彷佛檢查不出來,因此,用此方法既麻煩又不安全。

wKiom1hh0meCb4C7AAAyEHUocYU426.jpg-wh_50

wKioL1hh0mfRgfPwAAB2zkfiNiQ717.jpg-wh_50

 方法3.先刪除表中主鍵約束,再複製行,而後用限定影響行數的方式修改其中的一行的ID,而後恢復主鍵約束。此法很棒,推薦

--查詢約束名,並刪除約束
exec sp_helpconstraint 'da111_bak2'
alter table da111_bak2
drop
constraint pk_da111_bak2
--複製行
INSERT  da111_bak2
SELECT *
FROM da111_bak2
WHERE (scodel = '03-ne-076')
/*設置影響的行數,此處複製了一次,只設置1,若是複製了屢次共有n行重複,想最後只保留一行不被影響,則設置爲n-1*/
SET ROWCOUNT 1
--更新其中的1行,將ID值更改。
update da111_bak2
set id='14824553714603914625651755433750' --設置一個不一樣的值
WHERE (scodel = '03-ne-076')
--還原設置S
SET ROWCOUNT 0
--恢復主鍵約束
alter table da111_bak2
add
constraint pk_da111_bak2
primary key (id)

 參考:http://blog.163.com/m13864039250_1/blog/static/21386524820133155536227/

http://blog.sina.com.cn/s/blog_415b73d101000838.html

相關文章
相關標籤/搜索