環(huán)境:windows server 2003 sp2,sql server 2000,用于管理固定資產(chǎn)的軟件。
創(chuàng)新互聯(lián)公司專(zhuān)業(yè)為企業(yè)提供正陽(yáng)網(wǎng)站建設(shè)、正陽(yáng)做網(wǎng)站、正陽(yáng)網(wǎng)站設(shè)計(jì)、正陽(yáng)網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、正陽(yáng)企業(yè)網(wǎng)站模板建站服務(wù),十年正陽(yáng)做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
故障現(xiàn)象:
要同時(shí)增加兩臺(tái)思科交換機(jī)的固定資產(chǎn)信息,由于型號(hào)什么都一致,只是序列號(hào)不一樣。于是就想做完一臺(tái)后,能否直接復(fù)制一條單據(jù)過(guò)來(lái)改一下不一致的地方就行了。但是前臺(tái)無(wú)法實(shí)現(xiàn)。本著偷懶和學(xué)習(xí)的態(tài)度,殺到后臺(tái),直接打開(kāi)數(shù)據(jù)庫(kù)操作。 去了主鍵限制,用下面語(yǔ)句復(fù)制:
INSERT INTO da111 SELECT * FROM da111 WHERE (scodel = '03-ne-076')
復(fù)制完后,在結(jié)果列表中找到新復(fù)制的行,直接手動(dòng)修改主鍵ID,想讓兩條語(yǔ)句有所區(qū)別。此時(shí),只要鼠標(biāo)點(diǎn)擊此行以外其他地方,就提示“鍵列信息不足或不正確。更新影響到多行”,如下:
比較崩潰的是,不管是再重裝改回原來(lái)的ID值(還原成兩行一模一樣),或者用刪除語(yǔ)句刪除重復(fù),都會(huì)彈出如上警告,只有從右上角整個(gè)關(guān)閉查詢(xún)分析器窗口,才能進(jìn)行其他的操作。
原因分析:
不管是用語(yǔ)句,還是用鼠標(biāo)直接在表格里選中修改,其實(shí)都是update。對(duì)數(shù)據(jù)庫(kù)來(lái)說(shuō),此時(shí)等于是對(duì)兩條一模一樣的行進(jìn)行修改,對(duì)SQL SERVER來(lái)是不允許的。所以就會(huì)有如上提示。
那么對(duì)ORACLE來(lái)說(shuō)會(huì)不會(huì)因?yàn)橛蠷OWID的存在,就允許看上去一模一樣的行修改呢?晚點(diǎn)測(cè)試一下。
解決方法:
知道原因,解決辦法就好找了。
方法1.刪除所有的重復(fù)行,重新手動(dòng)一條條做!注意,需要關(guān)閉窗口重新打開(kāi)查詢(xún)分析器窗口來(lái)運(yùn)行語(yǔ)句:
DELETE FROM da111_bak2 --也可以直接用delete da111_bak2,不加from WHERE (scodel = '03-ne-076')
檢查表相關(guān)性的時(shí)候,可以用以下窗口來(lái)檢查。但是只能檢查過(guò)程、觸發(fā)器之類(lèi)的,如果是被別的表引用,似乎檢查不出來(lái),所以,用此方法既麻煩又不安全。
方法3.先刪除表中主鍵約束,再?gòu)?fù)制行,然后用限定影響行數(shù)的方式修改其中的一行的ID,然后恢復(fù)主鍵約束。此法很棒,推薦。
--查詢(xún)約束名,并刪除約束 exec sp_helpconstraint 'da111_bak2' alter table da111_bak2 drop constraint pk_da111_bak2 --復(fù)制行 INSERT da111_bak2 SELECT * FROM da111_bak2 WHERE (scodel = '03-ne-076') /*設(shè)置影響的行數(shù),此處復(fù)制了一次,只設(shè)置1,如果復(fù)制了多次共有n行重復(fù),想最后只保留一行不被影響,則設(shè)置為n-1*/ SET ROWCOUNT 1 --更新其中的1行,將ID值更改。 update da111_bak2 set id='14824553714603914625651755433750' --設(shè)置一個(gè)不同的值 WHERE (scodel = '03-ne-076') --還原設(shè)置S SET ROWCOUNT 0 --恢復(fù)主鍵約束 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