MySQL資料完整性約束
主鍵約束
主鍵可以是表中的某一列,也可以是表中的多個列所構成的一個組合;其中,由多個列組合而成的主鍵也稱為複合主鍵。在MySQL中,主鍵列必須遵守以下規則。
(1)每一個表只能定義一個主鍵。
(2)唯一性原則。主鍵的值,也稱鍵值,必須能夠唯一表示表中的每一條記錄,且不能為NULL。
(3)最小化規則。複合主鍵不能包含不必要的多餘列。也就是說,當從一個複合主鍵中刪除一列後,如果剩下的列構成的主鍵仍能滿足唯一性原則,那麼這個複合主鍵是不正確的。
(4)一個列名在複合主鍵的列表中只能出現一次。
示例:建立學生資訊表tb_student時,將學號(stu_id)欄位設定為主鍵。
CREATE TABLE tb_student ( stu_id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) );
示例:建立使用者資訊表tb_student時,將學號(stu_id)和所在班級號(class_id)欄位設定為複合主鍵。
CREATE TABLE tb_student
(
stu_id INT AUTO_INCREMENT,
name VARCHAR(30),
class_id INT NOT NULL,
PRIMARY KEY (stu_id,class_id)
);
示例:通過修改資料表結構,新增主鍵約束。
ALTER TABLE tb_student ADD CONSTRAINT PRIMARY KEY(stu_id);
唯一約束
唯一約束使用UNIQUE關鍵字來定義。唯一約束的值必須是唯一的,且不能為空(NULL)。
在MySQL中,唯一約束與主鍵之間存在以下兩點區別。
(1)一個表只能建立一個主鍵,但可以定義多個唯一約束。
(2)定義主鍵約束時,系統會自動建立PRIMARY KEY索引,而定義候選鍵約束時,系統會自動建立UNIQUE索引。
示例:建立使用者資訊表tb_student時,將學號(stu_id)和姓名(name)設定為唯一約束。
CREATE TABLE tb_student
(
stu_id INT UNIQUE,
name VARCHAR(30) UNIQUE
);
示例:建立使用者資訊表tb_student時,將學號(stu_id)和姓名(name)欄位設定為複合唯一約束。
CREATE TABLE tb_student ( stu_id INT, name VARCHAR(30), UNIQUE uniq_id_name (stu_id,name) );
示例:通過修改資料表結構,新增唯一約束。
ALTER TABLE tb_student ADD CONSTRAINT uniq_id_name UNIQUE(stu_id,name);
外來鍵約束
MySQL有兩種常用的引擎型別(MyISAM和InnoDB),目前,只用InnoDB引擎型別支援外來鍵約束。
示例:建立班級資訊表(tb_class)和學生資訊表(tb_student),並設定學生資訊表中班級編號(class_id)欄位的外來鍵約束。
-- 建立班級資訊表
CREATE TABLE tb_class
(
class_id INT AUTO_INCREMENT PRIMARY KEY,
class_name VARCHAR(30) NOT NULL
);
-- 建立學生資訊表,並設定班級ID的外來鍵約束
CREATE TABLE tb_student
(
stu_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30),
class_id INT NOT NULL,
FOREIGN KEY fk_class_id (class_id)
REFERENCES tb_class(class_id)
);
示例:通過修改資料表結構,新增外來鍵約束。
ALTER TABLE tb_student ADD CONSTRAINT FOREIGN KEY fk_class_id (class_id) REFERENCES tb_class(class_id);
非空約束
非空約約束就是限制必須為某個列提供值。空值(NULL)是不存在值,它既不是數字0,也不是空字串,而是不存在、未知的情況。
示例:建立學生資訊表tb_student時,將姓名(name)欄位新增為非空約束。
CREATE TABLE tb_student
(
stu_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL
);
示例:通過修改資料表結構,將姓名(name)欄位修改為非空。
ALTER TABLE tb_student MODIFY COLUMN name VARCHAR(30) NOT NULL;
檢查約束
檢查約束用來指定某列的可取值的範圍,它通過限制輸入到列中的值來強制域的完整性。
示例:建立學生資訊表tb_student時,將年齡(age)的值設定在7至18之間(不包括18)的數值。
CREATE TABLE tb_student
(
stu_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30),
age INT NOT NULL CHECK(age>=7 AND age<18)
);
注意:目前的MySQL版本只是對CHECK約束進行了分析處理,但會被直接忽略,並不會報錯。
約束的刪除
刪除約束語法:
ALTER TABLE 表名 DROP [FOREIGN KEY| INDEX 約束名稱]|[PRIMARY KEY]
示例:刪除約束。
CREATE TABLE tb_student
(
stu_id INT,
name VARCHAR(30) ,
class_id INT NOT NULL,
-- 主鍵約束
PRIMARY KEY(stu_id),
-- 外來鍵約束
FOREIGN KEY fk_class_id (class_id)
REFERENCES tb_class(class_id),
-- 唯一性約束
UNIQUE uniq_name (name)
);
-- 刪除主鍵約束
ALTER TABLE tb_student DROP PRIMARY KEY;
-- 刪除外來鍵約束
ALTER TABLE tb_student DROP FOREIGN KEY fk_class_id;
-- 刪除唯一性約束
ALTER TABLE tb_student DROP INDEX uniq_name;