MySQL數據庫——約束類型

約束的簡介

數據的完整性是指數據的正確性和一致性,可以通過定義表時定義完整性約束,也可以通過規則,索引,觸發器等。約束分爲兩類:行級和表級,處理機制是一樣的。行級約束放在列後,表級約束放在表後,多個列共用的約束放在表後。

完整性約束是一種規則,不佔用任何數據庫空間。完整性約束存在數據字典中,在執行SQL或PL/SQL期間使用。用戶可以指明約束是啓用的還是禁用的,當約束啓用時,他增強了數據的完整性,否則,則反之,但約束始終存在於數據字典中。總的來說

有五種:唯一性和主鍵約束、外鍵約束、檢查約束、空值約束、默認值約束,
有五大關鍵詞,UNIQUE和Primary Key, Foreign Key, CHECK, NOT NULL, DEFAULT

1、唯一性和主鍵約束

要求某一列,或幾列不能有重複的值,建立主鍵約束和唯一約束時,Oralce會基於約束列自動建立唯一索引;主鍵約束不允許爲NULL,唯一約束允許爲NULL,一張表只能建立一個主鍵約束。唯一性和主鍵約束類似,只是關鍵詞不同而已,語法一致。
創建約束

CREATE TABLE TABLE_NAME
(
    COL1 VARCHAR2(32) NOT NULL PRIMARY KEY,
)
CREATE TABLE TABLE_NAME
(
    COL1 VARCHAR2(32) NOT NULL CONSTRAINT PK_ID PRIMARY KEY,
)
CREATE TABLE TABLE_NAME
(
    COL1 VARCHAR2(32) NOT NULL,
    COL2 VARCHAR2(32) NOT NULL Foreign Key,
    CONSTRAINT PK_TABLE_NAME PRIMARY KEY(COL1,COL2)
)

修改約束

ALTER TABLE Table_Name
ADD CONSTRAINT PK_Table_Name PRIMARY KEY NONCLUSTERED(Col1)【這裏表明了是聚集還是非聚集主鍵索引】

如果唯一性約束保護多個數據列,那麼唯一性約束要作爲表約束增加。語法如下:

CONSTRAINT CONSTRAINT_NAME (COL1,COL2) UNIQUE USING INDEX TABLESPACE (TABLESPACE_NAME) STORAGE (STORED CLAUSE)

2、外鍵約束

剩下的約束寫法都是差不多,這裏就不多舉例了。

CREATE TABLE TABLE_NAME
(
    COL1 VARCHAR2(32) NOT NULL REFERENCES PRIMARY_TABLE(PRIMARY_COL) ON DELETE CASCADE,
)
CREATE TABLE TABLE_NAME
(
    COL1 VARCHAR2(32) NOT NULL,
    CONSTRAINT FK_TABLE_NAME FOREIGN KEY REFERENCES PRIMARY_TABLE(PRIMARY_COL) ON DELETE SET NULL
)

這裏需要注意的是ON 後面的內容。這個是關聯的關鍵。與刪除修改密切相關。
• NO ACTION:更新或刪除父表中的數據時,如果會使子表中的外鍵違反引用完整性,該動作將被禁止執行。
• CASCADE: 當父表中被引用列的數據被更新或刪除時,子表中的相應的數據也被更新或刪除。
• SET NULL:當父表數據被更新或刪除時,子表中的相應數據被設置成NULL值,前提是子表中的相應列允許NULL值。
• SET DEFAULT:當父表數據被更新或刪除時,子表中的數據被設置成默認值。前提是子表中的相應列設置有默認值。

3、檢查約束

檢查列的類型和範圍。語法:

CONSTRAINT [constraint_name] CHECK (condition); 比如:check(Age >2)

4、空值約束與默認約束

還有兩種方式,一種是默認值(default sysdate或者 default 1),一種是限制空值Not Null【NOT NULL只能在列級定義】,這也可以看成是約束,它的作用也是進行數據的完整性控制。
修改默認約束:

ALTER TABLE TABLENAME
ADD CONSTRAINT DF_TABLENAME_COL1 DEFAUIT('22') FOR COL1

修改NOT NULL是四個約束當中最特殊的,直接用Modify Col_Name NOT NULL 即可

刪除、禁用、啓用約束、修改約束名

ALTER TABLE table_name
DROP CONSTRAINT constraint_name(刪除約束)
DISABLE CONSTRAINT constraint_name;(啓用約束)
ENABLE CONSTRAINT constraint_name;(禁用約束)

ALTER TABLE table_name
RENAME CONSTRAINT old_constraint_name TO new_constraint_name(修改約束名)

select 'alter table '||table_name||' disable constraint '||constraint_name||';' from user_constraints where constraint_type='R';【禁用所有外鍵約束】

select 'alter table '||table_name||' enable constraint '||constraint_name||';' from user_constraints where constraint_type='R';【啓用所有外鍵約束】

select 'alter table '||table_name||' drop constraint '||constraint_name||';' from user_constraints where constraint_type='R';【刪除所有外鍵約束 】

所有約束信息:

SELECT * FROM user_constraints

超全面的測試IT技術課程,0元立即加入學習!有需要的朋友戳:


騰訊課堂測試技術學習地址

歡迎轉載,但未經作者同意請保留此段聲明,並在文章頁面明顯位置給出原文鏈接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章