1. 程式人生 > >mysql 約束

mysql 約束

必須 文章 student rop ssi postgresq join 用途 常量

文章來源:https://segmentfault.com/a/1190000006671061

一. 關系型數據庫

市場上主流的關系型數據庫:Oracle、DB2、Sybase 、PostgreSQL、Microsoft SQL Server、Microsoft Access、MySQL。
關系型數據庫有三大完整性:

  • 實體完整性:實體屬性中的標識屬性不能為空、不能重復,該約束通過制定的主鍵實現,其約束有系統強制實施

  • 參照完整性:實體中的外鍵可以為空,但不能是錯的。

  • 用戶定義完整性:某一具體的實際數據庫的約束條件,由應用環境所決定,反映某一具體應用所涉及的數據必須滿足的要求。(例如定義某一行不能為空)

約束主要完成對數據的檢驗限制,從而保證數據庫的完整性

二.約束

1.主鍵約束(PRIMARY KEY)

主鍵約束列不允許重復,即任意兩行的主鍵值都不相同;每行都具有一個主鍵值,也不允許出現空值;

單列主鍵

創建有兩種方式:
一種是直接對字段加primary key關鍵字:

CREATE TABLE student(
          id INT PRIMARY KEY,         
          name VARCHAR(20),          
          )

另外一種是通過額外加約束的方式:

CREATE TABLE student(
          id INT NOT NULL,         
          name VARCHAR(20), 
         CONSTRAINT PK_STUD_ID PRIMARY KEY(id)
         //PK_STUD_ID為約束的名字          
          )

聯合主鍵

有時候一個列的字段可能有重復,可以聯合多個列設為主鍵。

CREATE TABLE student(       
          name VARCHAR(20),
          class VARCHAR(20),
         CONSTRAINT PK_STUD_ID PRIMARY KEY(name,class)       
          )

其它操作

//刪除主鍵約束  
ALTER TABLE 表名 DROP PRIMARY KEY;    
//添加主鍵  
ALTER TABLE 表名 ADD PRIMARY KEY(列名);    
//修改列為主鍵
ALTER TABLE 表名 MODIFY 列名 數據類型 PRIMARY KEY;

2.外鍵約束(FOREIGN KEY)

外鍵約束是保證一個或兩個表之間的參照完整性,保持數據一致性。表的外鍵可以是另一表的主鍵(也可以是唯一索引,詳情看這裏), 外鍵可以有重復的, 可以是空值。實現一對一或一對多關系。

創建外鍵約束

CREATE TABLE classes(
          id INT AUTO_INCREMENT PRIMARY KEY,
          name VARCHAR(20) 
          );  
//第一種:添加關鍵字
CREATE TABLE student(
          id INT AUTO_INCREMENT,         
          name VARCHAR(20),          
          CONSTRAINT PK_ID PRIMARY KEY(id),                        
          class_id INT REFERENCES classes(id) 
          )
//第二種:額外聲明
CREATE TABLE student(
          id INT AUTO_INCREMENT,         
          name VARCHAR(20),          
          CONSTRAINT PK_ID PRIMARY KEY(id),                        
          class_id INT,
          CONSTRAINT fk_class_id FOREIGN KEY(classe_id) REFERENCES classes(id)
          )

外鍵約束的要求

  • 父表和子表必須使用相同的存儲引擎,而且禁止使用臨時表

  • 數據表的存儲引擎只能為InnoDB,default-storage-engine-INNODB

  • 外鍵列和參照列必須具有相似的數據類型,數字的長度或是有符號位必須相同,而字符 的長度可以不同

  • 外鍵列和參照列必須創建索引,如果外鍵列不存在索引的話,MySQL將自動創建索引。
    設定參照列:FOREIGN KEY(id) PEFERENCES provinces(id)

外鍵約束的參照操作

  • CASCADE:從父表刪除或更新且自動刪除或更新子表中匹配的行

  • SET NULL:從父表刪除或更新行,並設置子表中的外鍵列為NULL,如果使用該選項,必須保證子表列沒有指定NOT NULL

  • RESTRICT:拒絕對父表的刪除或更新操作

  • NO ACTION:標準SQL的關鍵字,在MySQL中與RESTRICT相同

其它操作

//刪除外鍵約束
 ALTER TABLE 表名 DROP FOREIGN KEY 外鍵約束名;
(創建外鍵的方法沒有指定約束名稱,系統會默認給外鍵約束分配外鍵約束名稱,命名為student_ibfk_n)

//增加外鍵約束 
 ALTER TABLE 表名 ADD FOREIGN KEY 列名 REFERENCES 父表(對應列名);

3.唯一約束(UNIQUE)

指定表中某一列或多個列不能有相同的兩行或者兩行以上的數據存在,

  • 唯一約束可以保證記錄的唯一性

  • 唯一約束的字段可以為空值(允許的空值有多個,但是最終存儲的只有一個)

  • 每張數據表可以存在多個唯一約束

UNIQUE KEY的用途:主要是用來防止數據插入的時候重復。

CREATE TABLE student
(
  name CHAR(20) UNIQUE KEY
 );

為表中列添加UNIQUE KEY

ALTER TABLE student MODIFY CHAR(20) UNIQUE KEY;

4.非空約束(NOT NULL)

輸入值必須是非空的,需要註意的是允許控制盡量不要太多,太多會更消耗數據庫性能。

CREATE TABLE student
(
  name CHAR(20) NOT NULL
 );

5.默認約束(DEFAULT)

默認約束有以下的要求:

  • 定義的常量必須與該列的數據類型、精度等匹配

  • 每個列只能定義一個DEFAULT約束

  • DEFAULT約束會在使用INSERT語句

這裏需要說明的是,DEFAULT後面不能像SQL Server那樣使用函數,後面只能是一個常量。官方文檔原文:

With one exception, the default value must be a constant; it cannot be a function or an expression.

如果我們想要獲取當前的時間,可以使用CURRENT_TIMESTAMP

CREATE TABLE student
(
   joinTime DATETIME DEFAULT CURRENT_TIMESTAMP
 );

6.CHECK約束

CHECK約束,驗證數據,比如性別中只能為女或男,而不能為其它。MySQL不支持check約束,但可以使用check約束,就是沒有任何效果。

三.參考資料

  1. 《大話數據庫》

  2. MySQL 5.7 Reference Manual

  3. Set NOW() as Default Value for datetime datatype?

  4. IMOOC課程:《與MySQL的零距離接觸》

mysql 約束