您好,登錄后才能下訂單哦!
環境:windows server 2003 sp2,sql server 2000,用于管理固定資產的軟件。
故障現象:
要同時增加兩臺思科交換機的固定資產信息,由于型號什么都一致,只是序列號不一樣。于是就想做完一臺后,能否直接復制一條單據過來改一下不一致的地方就行了。但是前臺無法實現。本著偷懶和學習的態度,殺到后臺,直接打開數據庫操作。 去了主鍵限制,用下面語句復制:
INSERT INTO da111 SELECT * FROM da111 WHERE (scodel = '03-ne-076')
復制完后,在結果列表中找到新復制的行,直接手動修改主鍵ID,想讓兩條語句有所區別。此時,只要鼠標點擊此行以外其他地方,就提示“鍵列信息不足或不正確。更新影響到多行”,如下:
比較崩潰的是,不管是再重裝改回原來的ID值(還原成兩行一模一樣),或者用刪除語句刪除重復,都會彈出如上警告,只有從右上角整個關閉查詢分析器窗口,才能進行其他的操作。
原因分析:
不管是用語句,還是用鼠標直接在表格里選中修改,其實都是update。對數據庫來說,此時等于是對兩條一模一樣的行進行修改,對SQL SERVER來是不允許的。所以就會有如上提示。
那么對ORACLE來說會不會因為有ROWID的存在,就允許看上去一模一樣的行修改呢?晚點測試一下。
解決方法:
知道原因,解決辦法就好找了。
方法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/
http://blog.sina.com.cn/s/blog_415b73d101000838.html
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。