文章目錄
- 【 1. 主鍵約束 PRIMARY KEY 】
- 1.1 在創建表時設置主鍵約束
- 設置單字段主鍵
- 在創建表時設置聯合主鍵
- 1.2 在修改表時添加主鍵約束
- 1.3 刪除主鍵約束
- 1.4 主鍵自增長 AUTO_INCREMENT
- 指定自增字段初始值
- 自增字段不連續
- 【 2. 外鍵約束 FOREIGN KEY 】
- 2.1 在創建表時設置外鍵約束
- 2.2 在修改表時設置外鍵約束
- 2.3 刪除外鍵約束
- 【 3. 唯一約束 UNIQUE KEY 】
- 3.1 在創建表時設置唯一約束
- 3.2 在修改表時添加唯一約束
- 3.3 刪除唯一約束
- 【 4. 檢查約束 CHECK 】
- 4.1 選取設置檢查約束的字段
- 4.2 在創建表時設置檢查約束
- 4.3 在修改表時添加檢查約束
- 4.4 刪除檢查約束
- 【 5. 默認值約束 Default 】
- 5.1 在創建表時設置默認值約束
- 5.2 在修改表時添加默認值約束
- 5.3 刪除默認值約束
- 【 6. 非空約束 NOT NULL 】
- 6.1 在創建表時設置非空約束
- 6.2 在修改表時添加非空約束
- 6.3 刪除非空約束
- 【 7. 查看表中的約束 】
- 在 MySQL 中, 約束 是指對表中數據的一種約束,能夠幫助數據庫管理員更好地管理數據庫,并且能夠確保數據庫中數據的正確性和有效性。
例如,在數據表中存放年齡的值時,如果存入 200、300 這些無效的值就毫無意義了。因此,使用約束來限定表中的數據范圍是很有必要的。
【 1. 主鍵約束 PRIMARY KEY 】
- 主鍵(PRIMARY KEY) 的完整稱呼是 主鍵約束,是 MySQL 中使用最為頻繁的約束。一般情況下,為了便于 DBMS 更快的查找到表中的記錄,都會在表中設置一個主鍵。
- 每個表只能定義一個主鍵 ,其它約束可以有多個。
- 唯一性原則 :主鍵字段的值在表中必須是唯一的,不存在重復的情況,且不能為 NULL。即 設置成主鍵約束的字段的值中不可能存在有相同主鍵值的數據,且不能為NULL ;否則,無法設置主鍵約束。
- 主鍵分為單字段主鍵和多字段聯合主鍵。在創建數據表時設置主鍵約束,既可以為表中的一個字段設置 單字段主鍵 ,也可以為表中多個字段設置 聯合主鍵 。
1.1 在創建表時設置主鍵約束
設置單字段主鍵
- 在 CREATE TABLE 語句中,通過 在字段后面加 PRIMARY KEY 關鍵字來指定主鍵 。基本語法:
<字段名> <數據類型> PRIMARY KEY [默認值]
- 實例
在 test_db 數據庫中創建 tb_emp3 數據表,其主鍵為 id
CREATE TABLE tb_emp3
(
id INT(11) PRIMARY KEY,
name VARCHAR(25),
deptId INT(11),
salary FLOAT
);
- 也可以在定義完所有字段之后指定主鍵,語法格式如下:
[CONSTRAINT <約束名>] PRIMARY KEY [字段名]
- 實例
在數據庫中創建 tb_emp4 數據表,其主鍵為 id。
CREATE TABLE tb_emp4
(
id INT(11),
name VARCHAR(25),
deptId INT(11),
salary FLOAT,
PRIMARY KEY(id)
);
在創建表時設置聯合主鍵
- 聯合主鍵 就是這個主鍵是由一張表中多個字段組成的約束,是指使用 表中的兩個或更多字段的組合來共同作為主鍵,以此來唯一標識表中的記錄 。當單個字段無法唯一標識表中的每一行數據,或者業務邏輯需要多個字段的組合來定義唯一性時,就會使用聯合主鍵。
- 最小化原則 :聯合主鍵不能包含不必要的多余字段。當把聯合主鍵的某一字段刪除后,如果剩下的字段構成的主鍵仍然滿足唯一性原則,那么這個聯合主鍵是不正確的。
- 比如,設置學生選課數據表時,使用學生編號做主鍵還是用課程編號做主鍵呢?如果用學生編號做主鍵,那么一個學生就只能選擇一門課程。如果用課程編號做主鍵,那么一門課程只能有一個學生來選。顯然,這兩種情況都是不符合實際情況的。
- 實際上設計學生選課表,要限定的是一個學生只能選擇同一課程一次。因此,學生編號和課程編號可以放在一起共同作為主鍵,這也就是聯合主鍵了。
- 基本語法
- 一個字段名只能在聯合主鍵字段表中出現一次 。
- 當主鍵是由多個字段組成時,不能直接在字段名后面聲明主鍵約束。
PRIMARY KEY [字段1,字段2,…,字段n]
- 實例
創建數據表 tb_emp5,假設表中沒有主鍵 id,為了唯一確定一個員工,可以把 name、deptId 聯合起來作為主鍵。
CREATE TABLE tb_emp5
(
name VARCHAR(25),
deptId INT(11),
salary FLOAT,
PRIMARY KEY(name,deptId)
);
1.2 在修改表時添加主鍵約束
- 基本語法
ALTER TABLE <數據表名> ADD PRIMARY KEY(<字段名>);
- 實例
修改數據表 student,將字段 id 設置為主鍵。
ALTER TABLE student ADD PRIMARY KEY(id);
1.3 刪除主鍵約束
- 由于主鍵約束在一個表中只能有一個,因此不需要指定主鍵名就可以刪除一個表中的主鍵約束。
基本語法:
ALTER TABLE <數據表名> DROP PRIMARY KEY;
- 實例
刪除 student 表中的主鍵約束。
ALTER TABLE student DROP PRIMARY KEY;
1.4 主鍵自增長 AUTO_INCREMENT
- 在 MySQL 中,當主鍵定義為 自增長 后,這個主鍵的值就不再需要用戶輸入數據了,而是由數據庫系統根據定義自動賦值。每增加一條記錄,主鍵會自動以相同的步長進行增長。
通過給字段添加 AUTO_INCREMENT 屬性來實現主鍵自增長,基本語法- 默認情況下,AUTO_INCREMENT 的 初始值是 1,每 新增一條記錄,字段值自動加 1。因此,這個字段不可能出現相同的值。
- 一個表中只能有一個字段使用 AUTO_INCREMENT 約束,且該字段必須有唯一索引,以避免序號重復(即為主鍵或主鍵的一部分)。
- AUTO_INCREMENT 約束的字段必須具備 非空 NOT NULL 屬性 。
- AUTO_INCREMENT 約束的字段 只能是整數類型 (TINYINT、SMALLINT、INT、BIGINT 等)。
- AUTO_INCREMENT 約束字段的 最大值受該字段的數據類型約束,如果達到上限,AUTO_INCREMENT 就會失效。
字段名 數據類型 AUTO_INCREMENT
- 實例
- 創建名為 tb_student 的數據表。其中,id 為主鍵,每插入一條新記錄,id 的值就會在前一條記錄的基礎上自動加 1。name 為非空字段,該字段的值不能為空值(NULL)。
CREATE TABLE tb_student(
id INT(4) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(25) NOT NULL
);
- 向 tb_student 表中插入數據。
INSERT INTO tb_student(name,id) VALUES('Java',NULL);
INSERT INTO tb_student(name,id) VALUES('Python',NULL);
INSERT INTO tb_student(name,id) VALUES('SQL',NULL);
- 查看表。
SELECT * FROM tb_student;
- 創建名為 tb_student 的數據表。其中,id 為主鍵,每插入一條新記錄,id 的值就會在前一條記錄的基礎上自動加 1。name 為非空字段,該字段的值不能為空值(NULL)。
指定自增字段初始值
- 如果第一條記錄設置了該字段的初始值,那么新增加的記錄就從這個初始值開始自增。
例如,如果表中插入的第一條記錄的 id 值設置為 5,那么再插入記錄時,id 值就會從 5 開始往上增加。 - 實例
- 創建表 tb_student2,指定主鍵從 100 開始自增長。
CREATE TABLE tb_student2 (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
PRIMARY KEY(ID)
)AUTO_INCREMENT=100;
- 向 tb_student2 表中插入數據。
INSERT INTO tb_student2 (name)VALUES('Java');
INSERT INTO tb_student2 (name)VALUES('Python');
- 使用 SELECT 命令查詢表中記錄
SELECT * FROM tb_student2;
- 創建表 tb_student2,指定主鍵從 100 開始自增長。
自增字段不連續
- 當唯一鍵沖突是,再插入新的數據時自增字段會不連續。
- 實例
- 創建表 tb_student3,其中 id 是自增主鍵字段,name 是唯一索引。
CREATE TABLE tb_student3(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) UNIQUE KEY,
age INT DEFAULT NULL
);
- 向 tb_student3 表中插入數據。
INSERT INTO tb_student3 VALUES(1,1,1);
- 此時,表 tb_student3 中已經有了(1,1,1)這條記錄,這時再執行一條插入數據命令會報錯。
這是由于表中已經存在 name=1 的記錄,所以報 Duplicate key error(唯一鍵沖突)。
INSERT INTO tb_student3 VALUES(null,1,1);
- 在這之后,再插入新的數據時,自增 id 就是 3,這樣就出現了自增字段值不連續的情況。
INSERT INTO tb_student3 VALUES(null,2,66);
- 查看結果
SELECT * FROM tb_student3;
- 創建表 tb_student3,其中 id 是自增主鍵字段,name 是唯一索引。
【 2. 外鍵約束 FOREIGN KEY 】
- MySQL 外鍵約束(FOREIGN KEY) 是表的一個特殊字段,經常與主鍵約束一起使用。對于兩個具有關聯關系的表而言,相關聯字段中主鍵所在的表就是 主表(父表) ,外鍵所在的表就是 從表(子表) 。外鍵用來建立主表與從表的關聯關系,為兩個表的數據建立連接,約束兩個表中數據的一致性和完整性 。
比如,一個水果攤,只有蘋果、桃子、李子、西瓜等 4 種水果,那么,你來到水果攤要買水果就只能選擇蘋果、桃子、李子和西瓜,其它的水果都是不能購買的。 - 定義外鍵時,需要遵守下列規則:
- 主表必須已經存在于數據庫中,或者是當前正在創建的表。如果主表當前正在創建,則主表與從表是同一個表,這樣的表稱為 自參照表 ,這種結構稱為 自參照完整性 。
- 必須為主表定義主鍵 。
- 一個表可以有一個或多個外鍵,外鍵可以為空值,若不為空值,則每一個外鍵的值必須等于主表中主鍵的某個值 。
- 在主表的表名后面指定列名或列名的組合,這個列或列的組合必須是主表的主鍵或候選鍵。
- 從表的外鍵關聯的必須是主表的主鍵,外鍵中列的數目、列的數據類型必須和主表主鍵相同 。
例如,兩者都是 INT 類型,或者都是 CHAR 類型。如果不滿足這樣的要求,在創建從表時,就會出現“ERROR 1005(HY000): Can’t create table”錯誤。
- 主表刪除某條記錄時,從表中與之對應的記錄也必須有相應的改變 。
2.1 在創建表時設置外鍵約束
- 基本語法:
[CONSTRAINT <外鍵名>] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主鍵列1 [,主鍵列2,…]
- 實例
- 創建1個數據表 tb_dept1,并在 tb_dept1 的 id 字段上創建主鍵約束。
CREATE TABLE tb_dept1
(
id INT(11) PRIMARY KEY,
name VARCHAR(22) NOT NULL,
location VARCHAR(50)
);
- 創建數據表 tb_emp6,并在表 tb_emp6 上創建外鍵約束,讓它的鍵 deptId 作為外鍵關聯到表 tb_dept1 的主鍵 id。
CREATE TABLE tb_emp6
(
id INT(11) PRIMARY KEY,
name VARCHAR(25),
deptId INT(11),
salary FLOAT,
CONSTRAINT fk_emp_dept1
FOREIGN KEY(deptId) REFERENCES tb_dept1(id)
);
- 創建1個數據表 tb_dept1,并在 tb_dept1 的 id 字段上創建主鍵約束。
2.2 在修改表時設置外鍵約束
- 外鍵約束也可以在修改表時添加,但是添加外鍵約束的前提是:從表中外鍵列中的數據必須全部來源于主鍵列或者是為空沒有數據,不過為空的數據跟與之相關聯的表就沒有關系了,一般不采用 。
基本語法:
ALTER TABLE <數據表名> ADD CONSTRAINT <外鍵名>
FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);
- 實例
修改數據表 tb_emp3,將字段 deptId 設置為外鍵,與數據表 tb_dept1 的主鍵 id 進行關聯。
ALTER TABLE tb_emp3
ADD CONSTRAINT fk_tb_dept1_2
FOREIGN KEY(deptId)
REFERENCES tb_dept1(id);
2.3 刪除外鍵約束
- 基本語法
ALTER TABLE <表名> DROP FOREIGN KEY <外鍵約束名>;
- 實例
刪除數據表 tb_emp3 中的外鍵約束 fk_tb_dept1_2。
ALTER TABLE tb_emp3 DROP FOREIGN KEY fk_tb_dept1_2;
【 3. 唯一約束 UNIQUE KEY 】
- MySQL 唯一約束(Unique Key) 是指 所有記錄中字段的值不能重復出現 。
例如,為 id 字段加上唯一性約束后,每條記錄的 id 值都是唯一的,不能出現重復的情況。如果其中一條記錄的 id 值為‘0001’,那么該表中另一條記錄的 id 值就不能為‘0001’。 - 唯一約束與主鍵約束相似的是它們都可以 確保列的唯一性 。不同的是,唯一約束在一個表中可有多個,并且設置唯一約束的列允許只能有一個空值。而主鍵約束在一個表中只能有一個,且不允許有空值 。
比如,在用戶信息表中,為了避免表中用戶名重名,可以把用戶名設置為唯一約束。
3.1 在創建表時設置唯一約束
- 唯一約束可以在創建表時直接設置,通常設置在除了主鍵以外的其它列上。基本語法:
- 在定義完列之后直接使用 UNIQUE 關鍵字指定唯一約束。
<字段名> <數據類型> UNIQUE
- 實例
創建數據表 tb_dept2,指定部門的名稱唯一。
CREATE TABLE tb_dept2
(
id INT(11) PRIMARY KEY,
name VARCHAR(22) UNIQUE,
location VARCHAR(50)
);
3.2 在修改表時添加唯一約束
- 基本語法
ALTER TABLE <數據表名> ADD CONSTRAINT <唯一約束名> UNIQUE(<列名>);
- 實例
ALTER TABLE tb_dept1 ADD CONSTRAINT unique_name UNIQUE(name);
3.3 刪除唯一約束
- 基本語法
ALTER TABLE <表名> DROP INDEX <唯一約束名>;
- 實例
ALTER TABLE tb_dept1 DROP INDEX unique_name;
【 4. 檢查約束 CHECK 】
- MySQL 檢查約束(CHECK) 是用來 檢查數據表中字段值有效性 的一種手段,設置檢查約束時要根據實際情況進行設置,這樣能夠減少無效數據的輸入。
4.1 選取設置檢查約束的字段
- 在更新表數據的時候,系統會檢查更新后的數據行是否滿足 CHECK 約束中的限定條件。MySQL 可以使用簡單的表達式來實現 CHECK 約束,也允許使用復雜的表達式作為限定條件,例如在限定條件中加入子查詢。
- 基本語法
- “表達式”指的就是 SQL 表達式,用于指定需要檢查的限定條件。
CHECK <表達式>
- 若將 CHECK 約束子句置于表中某個列的定義之后,則這種約束也稱為 基于列的 CHECK 約束 。
- 若將 CHECK 約束子句置于所有列的定義以及主鍵約束和外鍵定義之后,則這種約束也稱為 基于表的 CHECK 約束 。該約束可以同時對表中多個列設置限定條件。
4.2 在創建表時設置檢查約束
- 在創建表時就可以為字段設置檢查約束。
基本語法:
CHECK(<檢查約束>)
- 實例
創建 tb_emp7 數據表,要求 salary 字段值大于 0 且小于 10000。
CREATE TABLE tb_emp7
(
id INT(11) PRIMARY KEY,
name VARCHAR(25),
deptId INT(11),
salary FLOAT,
CHECK(salary>0 AND salary<100),
FOREIGN KEY(deptId) REFERENCES tb_dept1(id)
);
4.3 在修改表時添加檢查約束
- 如果一個表創建完成,可以通過修改表的方式為表添加檢查約束。
基本語法:
ALTER TABLE tb_emp7 ADD CONSTRAINT <檢查約束名> CHECK(<檢查約束>)
- 實例
修改 tb_emp7 數據表,要求 id 字段值大于 0。
ALTER TABLE tb_emp7
ADD CONSTRAINT check_id
CHECK(id>0);
4.4 刪除檢查約束
- 基本語法
ALTER TABLE <數據表名> DROP CONSTRAINT <檢查約束名>;
- 實例
刪除 tb_emp7 表中的 check_id 檢查約束。
ALTER TABLE tb_emp7
DROP CONSTRAINT check_id;
【 5. 默認值約束 Default 】
- 默認值(Default)的完整稱呼是 默認值約束(Default Constraint) ,用來指定某列的默認值。在表中插入一條新記錄時,如果沒有為某個字段賦值,系統就會自動為這個字段插入默認值。
5.1 在創建表時設置默認值約束
- 基本語法
- 其中,“默認值” 為該字段設置的默認值,如果是字符類型的,要用單引號括起來。
- 在創建表時為列添加默認值,可以一次為多個列添加默認值,需要注意不同列的數據類型。
<字段名> <數據類型> DEFAULT <默認值>;
- 實例
創建數據表 tb_dept3,指定部門位置默認為 Beijing,新插入的記錄如果沒有指定部門位置,則默認都為 Beijing。
CREATE TABLE tb_dept3
(
id INT(11) PRIMARY KEY,
name VARCHAR(22),
location VARCHAR(50) DEFAULT 'Beijing'
);
5.2 在修改表時添加默認值約束
- 基本語法
ALTER TABLE <數據表名>
CHANGE COLUMN <字段名> <數據類型> DEFAULT <默認值>;
- 實例
修改數據表 tb_dept3,將部門位置的默認值修改為 Shanghai。
ALTER TABLE tb_dept3
CHANGE COLUMN location
location VARCHAR(50) DEFAULT 'Shanghai';
5.3 刪除默認值約束
- 當一個表中的列不需要設置默認值時,就需要從表中將其刪除。
基本語法:
ALTER TABLE <數據表名>
CHANGE COLUMN <字段名> <字段名> <數據類型> DEFAULT NULL;
- 實例
修改數據表 tb_dept3,將部門位置的默認值約束刪除。
ALTER TABLE tb_dept3
CHANGE COLUMN location
location VARCHAR(50) DEFAULT NULL;
【 6. 非空約束 NOT NULL 】
- MySQL 非空約束(NOT NULL) 指 字段的值不能為空。對于使用了非空約束的字段,如果用戶在添加數據時沒有指定值,數據庫系統就會報錯。可以通過 CREATE TABLE 或 ALTER TABLE 語句實現。在表中某個列的定義后加上關鍵字 NOT NULL 作為限定詞,來約束該列的取值不能為空。
比如,在用戶信息表中,如果不添加用戶名,那么這條用戶信息就是無效的,這時就可以為用戶名字段設置非空約束。
6.1 在創建表時設置非空約束
- 基本語法
<字段名> <數據類型> NOT NULL;
- 實例
創建數據表 tb_dept4,指定部門名稱不能為空。
CREATE TABLE tb_dept4
(
id INT(11) PRIMARY KEY,
name VARCHAR(22) NOT NULL,
location VARCHAR(50)
);
6.2 在修改表時添加非空約束
- 如果在創建表時忘記了為字段設置非空約束,也可以通過修改表進行非空約束的添加。
基本語法:
ALTER TABLE <數據表名>
CHANGE COLUMN <字段名>
<字段名> <數據類型> NOT NULL;
- 實例
修改數據表 tb_dept4,指定部門位置不能為空。
ALTER TABLE tb_dept4
CHANGE COLUMN location
location VARCHAR(50) NOT NULL;
6.3 刪除非空約束
- 基本語法
ALTER TABLE <數據表名>
CHANGE COLUMN <字段名> <字段名> <數據類型> NULL;
- 實例
修改數據表 tb_dept4,將部門位置的非空約束刪除。
ALTER TABLE tb_dept4
CHANGE COLUMN location
location VARCHAR(50) NULL;
【 7. 查看表中的約束 】
- 基本語法
SHOW CREATE TABLE <數據表名>;
- 實例
- 創建數據表 tb_emp8 并指定 id 為主鍵約束,name 為唯一約束,deptId 為非空約束和外鍵約束。
CREATE TABLE tb_emp8
(
id INT(11) PRIMARY KEY,
name VARCHAR(22) UNIQUE,
deptId INT(11) NOT NULL,
salary FLOAT DEFAULT 0,
CHECK(salary>0),
FOREIGN KEY(deptId) REFERENCES tb_dept1(id)
);
- 查看表中的約束
SHOW CREATE TABLE tb_emp8 \G
- 創建數據表 tb_emp8 并指定 id 為主鍵約束,name 為唯一約束,deptId 為非空約束和外鍵約束。