1. 程式人生 > >SQLServer之修改FOREIGN KEY約束

SQLServer之修改FOREIGN KEY約束

使用SSMS資料庫管理工具修改FOREIGN KEY約束

1、連線資料庫,選擇資料表-》右鍵點選-》選擇設計(或者展開鍵,選擇要修改的外來鍵,右鍵點選,選擇修改,後面修改步驟相同)。

2、在表設計視窗中-》選擇要修改的外來鍵列-》右鍵點選-》選擇關係。

3、在外來鍵關係彈出框中-》選中要修改的外來鍵-》點選修改表和列規範。

4、在表和列彈出框中-》輸入要修改的外建名-》選擇要修改的主鍵基表-》選擇要修改的主鍵基表的資料列-》選擇要修改的外來鍵基表-》選擇要修改的外來鍵基表資料列-》點選確定。

5、在外來鍵關係彈出框中-》輸入要修改的外來鍵名稱-》輸入要修改的外來鍵描述-》表設計規則可根據實際情況選擇-》點選關閉。

6、點選儲存(或者ctrl+s)-》關閉表設計器-》重新整理表-》開啟外來鍵檢視修改結果。

使用T-SQL指令碼修改FOREIGN KEY約束

若要使用Transact-SQL修改FOREIGN KEY約束,必須先刪除現有的FOREIGN KEY約束,然後再用新定義重新建立該約束。

語法:

--宣告資料庫
use 資料庫名;
go

--判斷如果存在外來鍵則刪除
if exists(select * from sysobjects where name=約束名)
alter table 表名 drop constraint 約束名;
go

--新增外來鍵約束
alter table 表名 --外來鍵基表,顯示哪個表包含用作所選關係中外來鍵的列。
[with check | with nocheck] --強制用於複製,指示當複製代理對此表執行插入、更新或刪除操作時是否強制約束。
add constraint 約束名--標識類別,外來鍵名稱。
foreign key(列名) --外來鍵列,顯示哪個列用作所選關係的外來鍵。
references 表名--主/唯一鍵基表,顯示哪個表包含用作所選關係中主鍵(或唯一鍵)的列。
(列名) --主/唯一鍵列,顯示哪個列用作所選關係的主鍵(或唯一鍵)。
--更新規則
--no action:不執行任何操作,錯誤訊息告知使用者不允許進行更新並將回滾 UPDATE。
--cascade:級聯,更新所有包含外來鍵關係所涉及資料的行。 如果該表將包含在使用邏輯記錄的合併釋出中,則不要指定 CASCADE。
--set null:設定null,如果表的所有外來鍵列都可接受 Null 值,則將該值設定為 Null。
--set default:設定預設值,如果表的所有外來鍵列均已定義預設值,則將值設定成為該列定義的預設值。
on update [no action | cascade | set null | set default]
--刪除規則
--no action:不執行任何操作,錯誤訊息告知使用者不允許進行刪除並將回滾 DELETE。
--cascade:級聯,刪除所有包含外來鍵關係所涉及資料的行。 如果該表將包含在使用邏輯記錄的合併釋出中,則不要指定 CASCADE。
--set null:設定null,如果表的所有外來鍵列都可接受 Null 值,則將該值設定為 Null。
--set default:設定預設值,如果表的所有外來鍵列均已定義預設值,則將值設定成為該列定義的預設值。 
on delete [no action | cascade | set null | set default]
go

--強制外來鍵約束
--指示如果對關係中列資料的更改會使外來鍵關係的完整性失效,是否允許進行這樣的更改。 如果不允許這樣的更改,則選擇 “是” ;如果允許這樣的更改,則選擇 “否” 。
alter table 表名 [nocheck | check] constraint 約束名;
go

--新增外來鍵約束描述
execute sp_addextendedproperty N'MS_Description',N'約束描述',N'schema',N'dbo',N'table',N'表名',N'constraint',N'約束名';
go

示例:

--宣告資料庫
use testss;
go

--判斷如果存在外來鍵則刪除
if exists(select * from sysobjects where name='foreign1')
alter table test1 drop constraint foreign1;
go

--新增外來鍵約束
alter table test1 --外來鍵基表,顯示哪個表包含用作所選關係中外來鍵的列。
with check --強制用於複製,指示當複製代理對此表執行插入、更新或刪除操作時是否強制約束。
add constraint foreign1 --標識類別,外來鍵名稱。
foreign key(classid) --外來鍵列,顯示哪個列用作所選關係的外來鍵。
references test2 --主/唯一鍵基表,顯示哪個表包含用作所選關係中主鍵(或唯一鍵)的列。
(id) --主/唯一鍵列,顯示哪個列用作所選關係的主鍵(或唯一鍵)。
--更新規則
--no action:不執行任何操作,錯誤訊息告知使用者不允許進行更新並將回滾 UPDATE。
--cascade:級聯,更新所有包含外來鍵關係所涉及資料的行。 如果該表將包含在使用邏輯記錄的合併釋出中,則不要指定 CASCADE。
--set null:設定null,如果表的所有外來鍵列都可接受 Null 值,則將該值設定為 Null。
--set default:設定預設值,如果表的所有外來鍵列均已定義預設值,則將值設定成為該列定義的預設值。
on update cascade
--刪除規則
--no action:不執行任何操作,錯誤訊息告知使用者不允許進行刪除並將回滾 DELETE。
--cascade:級聯,刪除所有包含外來鍵關係所涉及資料的行。 如果該表將包含在使用邏輯記錄的合併釋出中,則不要指定 CASCADE。
--set null:設定null,如果表的所有外來鍵列都可接受 Null 值,則將該值設定為 Null。
--set default:設定預設值,如果表的所有外來鍵列均已定義預設值,則將值設定成為該列定義的預設值。 
on delete cascade
go

--強制外來鍵約束
--指示如果對關係中列資料的更改會使外來鍵關係的完整性失效,是否允許進行這樣的更改。 如果不允許這樣的更改,則選擇 “是” ;如果允許這樣的更改,則選擇 “否” 。
alter table test1 nocheck constraint foreign1;
go

--新增外來鍵約束描述
execute sp_addextendedproperty N'MS_Description',N'修改外來鍵約束',N'schema',N'dbo',N'table',N'test1',N'constraint',N'foreign1';
go

修改FOREIGN KEY優缺點

優點:

1、保證資料的完整性。

2.、關聯查詢時,可以用到FK 的統計資訊。

3、合理使用外來鍵,可以增加查詢效率。

缺點:

1、刪隊或更新關聯資料時需要做檢查,效率會很低。

2、資料量很大,併發量很大,會影響效能。

3、外來鍵雖然保證完整性,但是對於主表刪除這種操作,都級聯掃描一遍所有的子表取刪除,資料越大越慢,鎖粒度也會大。

4、匯入匯出,其它高可用等手工調資料時非常麻煩給。