1. 程式人生 > >關閉資料庫外來鍵約束

關閉資料庫外來鍵約束

本文的測試環境是:

  • 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