環境:windows server 2003 sp2,sql server 2000,用於管理固定資產的軟件。html
故障現象:sql
要同時增長兩臺思科交換機的固定資產信息,因爲型號什麼都一致,只是序列號不同。因而就想作完一臺後,可否直接複製一條單據過來改一下不一致的地方就好了。可是前臺沒法實現。本着偷懶和學習的態度,殺到後臺,直接打開數據庫操做。 去了主鍵限制,用下面語句複製:數據庫
INSERT INTO da111 SELECT * FROM da111 WHERE (scodel = '03-ne-076')
複製完後,在結果列表中找到新複製的行,直接手動修改主鍵ID,想讓兩條語句有所區別。此時,只要鼠標點擊此行之外其餘地方,就提示「鍵列信息不足或不正確。更新影響到多行」,以下:windows
比較崩潰的是,無論是再重裝改回原來的ID值(還原成兩行如出一轍),或者用刪除語句刪除重複,都會彈出如上警告,只有從右上角整個關閉查詢分析器窗口,才能進行其餘的操做。安全
緣由分析:ide
無論是用語句,仍是用鼠標直接在表格裏選中修改,其實都是update。對數據庫來講,此時等因而對兩條如出一轍的行進行修改,對SQL SERVER來是不容許的。因此就會有如上提示。學習
那麼對ORACLE來講會不會由於有ROWID的存在,就容許看上去如出一轍的行修改呢?晚點測試一下。測試
解決方法:spa
知道緣由,解決辦法就好找了。3d
方法1.刪除全部的重複行,從新手動一條條作!注意,須要關閉窗口從新打開查詢分析器窗口來運行語句:
DELETE FROM da111_bak2 --也能夠直接用delete da111_bak2,不加from WHERE (scodel = '03-ne-076')
檢查表相關性的時候,能夠用如下窗口來檢查。可是隻能檢查過程、觸發器之類的,若是是被別的表引用,彷佛檢查不出來,因此,用此方法既麻煩又不安全。
方法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/