1. 程式人生 > >SQL 關於主鍵和自增長標識列的修改

SQL 關於主鍵和自增長標識列的修改

這篇文章我總結下在使用SQL查詢或修改資料庫的時候經常會碰到的兩個問題,以及對這兩個問題解決方法。

  • 第一個問題:對主鍵的修改,修改主鍵經常會碰到主鍵約束而造成update語句無法像對於普通無約束欄位的操作那樣方便。
  • 第二個問題:自增長標識列的修改,identity宣告的標識欄位在遭遇部分行的刪除操作後,會預設自動繼續增長而不會補全後增長。

開頭先宣告下我使用的開發環境是SQL Server 2008。

一、對主鍵的修改

主鍵值都會帶有主鍵約束,當執行update操作或是其他操作的時候就會受到限制無法修改,解決的方法是:取消主鍵約束->刪掉主鍵列->插入修改後的主鍵值。

(1)取消主鍵約束

取消主鍵約束的SQL語句如下:

alter table [表名] drop constraint [主鍵名]
輸入表名和主鍵名時不要帶中括號(下同),這裡值得說明的是[主鍵名]並不是主鍵所在的欄位名。主鍵名如果沒有指定系統會自動分配一個,這時就需要查詢主鍵名,查詢主鍵名的方法如下:
--使用sql儲存方式進行主鍵的查詢
exec sp_pkeys @table_name='[表名]'
--查詢表的詳細資訊,在其中找到主鍵名
sp_help [表名]
在這裡順便介紹下如何查詢主鍵的列名,雖然這可能用的不多,但以下這個方法還是比較直觀的:
select TABLE_NAME,COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE
where TABLE_NAME='[表名]'
(2)刪掉主鍵列

上一步總結了一些補充的知識,這一步就簡單許多了,方法如下:

alter table [表名] drop column [欄位名]
(3)插入修改後的主鍵名
alter table [表名] add constraint [主鍵名] primary key(欄位名)
值得說明的是,這裡的主鍵名是自定義的主鍵名,指定之後如果以後還需取消主鍵約束就可以用這個主鍵名,而不再是系統自動分配的欄位名了。

二、自增長識別符號的修改

這個問題主要遇到的情形是,在刪除了一段連續的帶有自增長欄位的一部分資料項之後,自增長序列不會自動補全,而是按照原先的計數繼續增長。舉個例一段連續的自增長欄位(1,2,3,…,8,9),我們將其中的(7,8,9)delete掉後再向其中插入新的資料,此時新序列標號不是7而是10。

解決的方法有兩種:設定序列自增長開關和重置序列自增長起始數。

(1)設定序列自增長開關

取消序列的自增長的SQL語句:

set identity_insert [表名] on
這條語句執行完後,再進行插入時需要指定插入項的序列值,而不會引起序列的自增長。當修改完成後,如果還想讓序列具有自增長性需要進行恢復操作:
set identity_insert [表名] off
(2)重置序列自增長起始數
dbcc checkident([表名],RESEED,[數字])
該語句可用來重置自增長序列的起始值,[數字]處設定起始值。
dbcc checkident([表名],NORESEED)
該語句可用來查詢目前自增序列的當前值。