使用SSMS資料庫管理工具修改FOREIGN KEY約束 1、連接資料庫,選擇數據表-》右鍵點擊-》選擇設計(或者展開鍵,選擇要修改的外鍵,右鍵點擊,選擇修改,後面修改步驟相同)。 2、在表設計視窗中-》選擇要修改的外鍵列-》右鍵點擊-》選擇關係。 3、在外鍵關係彈出框中-》選中要修改的外鍵-》點擊 ...
使用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、導入導出,其它高可用等手工調數據時非常麻煩給。