本文的測試環境是:
- MySQL 5.5.16
- Microsoft SQL Server 2008 R2 (SP2)
- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
當向數據庫中插入數據的時候,如果有表之間的關係十分複雜,尤其是是存在各種外鍵關係,這是需要暫時關閉這種針對外鍵約束的檢查,本文針對以下三種數據庫進行了一個總結,如下:
一、MySQL
數據庫
MySQL
中數據庫中的外鍵約束是通過變量foreign_key_checks
作用的,這個變量管理的全局的外鍵約束,而沒有針對每個表的外鍵約束進行單獨管理。
1. 查看變量外鍵約束
show variables like '%foreign_key_checks%'
select @@foreign_key_checks
2. 開啓外鍵約束:
set foreign_key_checks = 1
3.關閉外鍵約束:
set foreign_key_checks = 0
二、SQL Server
數據庫
在SQL Server
數據庫中針對外鍵約束進行了統一的管理,它的粒度已經到表的層次,而不像MySQL
中的那樣只能對全局進行設置。SQL Server
中外鍵約束的管理是通過系統的存儲過程來實現的,如下:
sp_helpconstraint [ @objname = ] 'table' [ , [ @nomsg = ] 'no_message' ]
@objname
:約束信息所在的表名,類型爲nvarchar(776),沒有默認值;@nomsg
:要打印表名信息,幾乎不用;
1. 查看約束信息
EXEC sp_helpconstraint 't_archetype_revision_file'
在存儲過程中查詢到的約束信息有:
- Constraint_Type:列的約束類型,約束的類型有:
PRIMARY KEY
FOREIGN KEY
DEFAULT
CHECK
- Constraint_Name:用戶或者系統定義的約束名稱;
- Delete_action :針對外鍵約束,當外鍵刪除時採取的操作,爲No Action或者cascade;
- Update_Action:針對外鍵約束,當外鍵更新時採取的操作,爲No Action或者cascade;
- Status_Enabled :針對外鍵約束和check約束,是否啓用,當約束建立時默認是啓用的;
- Status_For_Replication :針對外鍵和check約束,當複製的時候是否強制執行;
- Constraint_Keys :針對check和default約束顯示的是表達式,針對其他約束顯示的是列名;
2. 開啓外鍵約束
通過Alter Table語句完成,示例如下:
Alter Table t_archetype_revision_file CHECK CONSTRAINT FK1jdbfqwxvcn37y16ofob43ywf
3. 關閉外鍵約束
Alter Table t_archetype_revision_file NOCHECK CONSTRAINT FK1jdbfqwxvcn37y16ofob43ywf
三、Oracle
數據庫
Oracle中的外鍵約束的管理與SQL Server中的類似,也是統一管理的,針對的也是表的層次。外鍵約束的統一管理是在數據字典表user_constraints中。
1.查看約束
SELECT * FROM user_constraints
在裏面有很多的字段,這裏我們只關注相關的幾項:
- CONSTRAINT_NAME:約束名稱;
- CONSTRAINT__TYPE:約束類型,包括:
- R:外鍵約束;
- U:唯一約束;
- P:主鍵約束;
- C:check約束;
- O:用於視圖,只讀約束;
- ……
- TABLE_NAME:約束所在的表;
- STATUS:使用狀態,ENABLED標識啓用,DISABLED標識禁用;
但是在這個視圖中,沒有約束對應的表的列,可以通過連接user_cons_columns來查詢,如下:
SELECT * FROM user_constraints t1 left join user_cons_columns t2 on t1.CONSTRAINT_NAME = t2.CONSTRAINT_NAME where t1.CONSTRAINT_NAME = 'LOGMNR_SESSION_EVOLVE$_PK'
2. 開啓外鍵約束
默認情況下,建立約束時開啓該約束。
alter table table_name enable constraint constraint_name
3. 關閉外鍵約束
alter table table_name disable constraint constraint_name