1. 程式人生 > >MySQL資料完整性約束

MySQL資料完整性約束

資料完整性是指資料的正確性和相容性,是為了防止資料庫中存在不符合語義的資料,即防止資料庫中存在不正確的資料。在MySQL中提供了多種完整性約束。

1、主鍵約束

主鍵可以是表中的某一列,也可以是表中的多個列所構成的一個組合;其中,由多個列組合而成的主鍵也稱為複合主鍵。在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);

2、唯一約束

唯一約束使用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);

3、外來鍵約束

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);

4、非空約束

非空約約束就是限制必須為某個列提供值。空值(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;

5、檢查約束

檢查約束用來指定某列的可取值的範圍,它通過限制輸入到列中的值來強制域的完整性。

示例:建立使用者資訊表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約束進行了分析處理,但會被直接忽略,並不會報錯。

6、約束的刪除

刪除約束語法:

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;