PRIMARY KEY 約束唯一標識數據庫表中的每條記錄。主鍵必須包含唯一的值。主鍵列不能包含 NULL 值。每個表都應該有一個主鍵,並且每個表只能有一個主鍵。主鍵約束操作包含了添加約束和刪除約束,修改約束其實是添加約束或者刪除約束。添加主鍵約束比較 簡單,但是刪除一個沒有約束名的主鍵約束則比較復雜,如果不是很不了解SQL Server的話則比很難實現該功能。
主鍵約束操作基本語句
如果是在新建表的時候添加主鍵約束比較簡單,直接在列名后加入primary key即可,標准的添加主鍵約束的SQL腳本如下:
create table 表名 ( 字段名1 int not null, …………, |
其中約束名可選(建議選擇,否則系統會分配隨機臨時名稱)。這種方法可以任意添加多個或一個主鍵約束。
對已有表添加主鍵約束,與上面的腳本類似,如下:
alter table 表名 [add constraint 約束名] primary key(字段名1 ,… ) |
其中約束名與上相同,可選,建議指定。
SQL Server刪除主鍵約束與MySQL不同,需要主鍵的約束名稱才能刪除,SQL Server標准的刪除主鍵的腳本如下:
ALTER TABLE 表名DROP CONSTRAINT 約束名 |
當然該語句只能刪除已知約束名的主鍵約束。
刪除未知主鍵約束名的約束
根據之前的語句判斷,這個約束名如果之前已經指定了那還好,否則此次就沒有辦法刪除了,重點在於如何獲取表中的主鍵約束名,既然可以根據約束名,那么就說明約束名是存儲在數據庫中的,當然是存儲在系統表中的,運行下SELECT × FROM SYS.OBJECTS 語句看看查詢結果,數據庫中所有的約束都 在里面了,name項以PK大頭的都是主鍵約束,看看它的type_desc是不是PRIMARY_KEY_CONSTRAINT或者type是不是 PK?(當然指定的名稱沒使用PK前綴另當別論)。既然已知表名,而且也知道主鍵約束存儲位置,關鍵就是二者如何關聯起來,使得使用表名就可以查詢到主鍵 約束名稱,這其中溝通的橋梁便是parent_object_id。這里給出的只是object_id,那么又如何找出表的object_id呢?再仔細 看看剛才的搜索結果,原來數據庫中的相關信息全在里面,表,函數等都在里面,而且有自身的object_id。
接下來整合下上面的思路,根據表名查詢表ID,根據表ID找到主鍵約束名稱,采用級聯方式查詢就可以查詢出來。可以構造如下的查詢語句:
DECLARE @NAME SYSNAME FROM SYS.OBJECTS WITH(NOLOCK) WHERE NAME = @TB_NAME ) |
然后SELECT @NAME就是我們需要的約束名稱了。然后在構造一個上面的刪除約束的SQL語句執行就可以了,典型的SQL如下:
SELECT @NAME |
把上面的SQL語句合起來,只要替換下表名就可以了,當然更好的辦法是制作成一個函數,調用起來就更簡單了,這里就不再詳述。
上面的SQL中有一句TOP 1,那么對於有兩個主鍵的是不是有問題呢,當然沒有問題,因為一個表中只有一個主鍵約束。
上面的腳本很有可能不能在SQL Server 2000中正確執行,SQL Server 2000中的這個表和2005中有區別,根據表結構調整就可以了。
其他約束都可以采用這種方法進行刪除。