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

2021-06-22 19:26:55 字數 1680 閱讀 6145

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

開頭先宣告下我使用的開發環境是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)
該語句可用來查詢目前自增序列的當前值。

mysql標識列 自增長列

直接po 和案例 標識列 又稱為自增長列 含義 可以不用手動的插入值,系統提供預設的序列值 特點 1 標識列必須和主鍵搭配嗎?不一定,但要求是乙個key 2 乙個表可以有幾個標識列?至多乙個!3 標識列的型別只能是數值型 4 標識列可以通過 set auto increment increment ...

mysql 標識列 自增長列

1.含義 可以不用手動插入值,系統提供預設的序列值 2.特點 1 標識列不一定必須和主鍵搭配,但要求是乙個key 主鍵 unique 外來鍵 2 乙個表最多有乙個標識列 3 標識列的型別只能是數值型 int float double等 4 標識列可以通過 set auto increment inc...

133 標識列 自增長列

特點 1 表示列必須和主鍵搭配嗎?不一定,但要求是乙個key 2 乙個表可以有幾個標識列?至多乙個!3 標識列的型別,只能是數值型。4 標識類可以通過set auto increment 值,來設定步長 建立表時設定標識列 create table tab identity id int prima...