SQL Server中為現(xiàn)有的列添加或去掉標(biāo)識(shí)屬性
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
問(wèn)題: SQL Server有一個(gè)不錯(cuò)的常用特性,就是標(biāo)識(shí)列。利用這個(gè)特性,你可以輕松地在表里為每一行創(chuàng)建唯一的值。添加一個(gè)新的列并設(shè)置為標(biāo)識(shí)列,或者刪除現(xiàn)有標(biāo)識(shí)列都很簡(jiǎn)單,但是如果是要把一個(gè)現(xiàn)有的列改為標(biāo)識(shí)列,或者去掉現(xiàn)有的標(biāo)識(shí)列的標(biāo)識(shí)屬性,那應(yīng)該怎么做呢? 專(zhuān)家解答: 要做到這一步并不容易,或者說(shuō)沒(méi)有什么簡(jiǎn)單易行的方法。SQL Server的設(shè)計(jì)里并沒(méi)有很簡(jiǎn)單的就現(xiàn)有的列加上或去掉標(biāo)識(shí)屬性的方法。最安全的辦法是,創(chuàng)建一個(gè)新的列并設(shè)置為標(biāo)識(shí)列,或者創(chuàng)建一個(gè)新的表,然后把數(shù)據(jù)移植進(jìn)去。 我們來(lái)看看一些例子: 例一 現(xiàn)有一個(gè)簡(jiǎn)單的表,表里含有兩列,其中一列為標(biāo)識(shí)列。
如果我們用SQL Server Management Studio來(lái)去掉”id”列的標(biāo)識(shí)值,這樣就會(huì)創(chuàng)建出一個(gè)新的臨時(shí)表,原表的數(shù)據(jù)都移到了臨時(shí)表中,然后刪除原表并為新表重命名。我們可以從下面的腳本里看到這個(gè)過(guò)程。 要看到這個(gè)腳本,只要使用 Management Studio來(lái)進(jìn)行改動(dòng),然后右擊designer,選擇"Generate Change Script"。
例二 我們現(xiàn)在來(lái)把它弄得更復(fù)雜一點(diǎn),在表里設(shè)置主鍵,然后創(chuàng)建以外鍵約束的另一個(gè)表,以第一個(gè)表主鍵為索引。我們可以看到這樣做需要花更多工夫。
如果我們按照上述的方法,然后使用Management Studio去掉表“test 1”中“id”列的標(biāo)識(shí)值,可以從腳本里看到,這樣需要更多的步驟才能達(dá)到我們的目的。 首先創(chuàng)建一個(gè)列屬性正確的臨時(shí)表“Tmp_Test1” 把數(shù)據(jù)從表“Test1”移植到臨時(shí)表“Tmp_Test1”中 去掉Test2的外鍵約束 刪除表“Test1” 臨時(shí)表“Tmp_Test1”重命名為“Test1” 在表“Test1”里創(chuàng)建主鍵 最后重新在表“Test2”里創(chuàng)建外鍵約束。步驟太多了!
同樣,如果我們想要對(duì)現(xiàn)有的列進(jìn)行修改,把其中一列變成標(biāo)識(shí)列的話,需要花費(fèi)同樣的工夫。 另外一種可行的方法就是增加一列并設(shè)置為標(biāo)識(shí)列,或者增加一列然后把舊列的數(shù)據(jù)移植到新列里。然后你可以刪除之前的列,使用sp_rename存儲(chǔ)過(guò)程來(lái)對(duì)進(jìn)行新增列重命名。如果這些列里含有索引、外鍵或其他約束,你需要把它們都去掉才能作上述的修改。所以,這個(gè)方法也快不了多少。 我們現(xiàn)在知道,要修改現(xiàn)有列的標(biāo)識(shí)屬性沒(méi)有什么捷徑可走。你也可以在網(wǎng)絡(luò)上搜索到其他的辦法,可以修改系統(tǒng)表里的值。這些方法確實(shí)可以行得通,不過(guò)要注意的是,一旦出了什么差錯(cuò),你可能會(huì)把數(shù)據(jù)全毀掉。 對(duì)于比較小的數(shù)據(jù)庫(kù)系統(tǒng)而言,這里介紹的方法沒(méi)有什么太大問(wèn)題。不過(guò)對(duì)于忙碌的大數(shù)據(jù)庫(kù)系統(tǒng)來(lái)說(shuō),去掉表里的約束、修改表里的標(biāo)識(shí)屬性就會(huì)是一件讓人頭疼的事情了。現(xiàn)在只能是期待SQL 2008里會(huì)不會(huì)出現(xiàn)什么讓人眼前一亮的新特性了。 該文章在 2012/2/11 0:26:30 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |