昆明大型網(wǎng)站建設(shè)東莞網(wǎng)絡(luò)推廣及優(yōu)化
【MySQL】第十七部分 約束
文章目錄
- 【MySQL】第十七部分 約束
- 17. 約束
- 17.1 約束的分類
- 17.2 非空約束
- 17.3 唯一性約束
- 17.4 主鍵約束
- 17.5 自增列約束
- 17.6 外鍵約束
- 17.7 默認(rèn)約束
- 17.8 check約束
- 總結(jié)
17. 約束
約束: 可以在創(chuàng)建表的時(shí)候規(guī)定約束,也可以在表創(chuàng)建之后添加,約束顧名思義就是限制條件
17.1 約束的分類
單列約束:每個(gè)約束只約束一列
多列約束:每個(gè)約束可約束多列數(shù)據(jù)
列級(jí)約束:只能作用在一個(gè)列上,跟在列的定義后面
表級(jí)約束:可以作用在多個(gè)列上,不與列一起,而是單獨(dú)定義
17.2 非空約束
添加非空約束
# 1. 在創(chuàng)建表的時(shí)候添加非空約束
CREATE TABLE test1(id INT NOT NUll,name VARCHAR(10) NOT NULL,salary DECIMAL(10,2)
);# 2. 表創(chuàng)建后添加非空約束
ALTER TABLE test1
MODIFY salary DECIMAL(10,2) NOT NULL;
刪除非空約束
ALTER TABLE test1
MODIFY salary DECIMAL(10,2);
17.3 唯一性約束
知識(shí)點(diǎn):
- 同一個(gè)表可以有多個(gè)唯一約束
- 唯一約束可以是某一個(gè)列的值唯一,也可以多個(gè)列組合的值唯一
- 唯一性約束允許列值為空
- 在創(chuàng)建唯一約束的時(shí)候,如果不給唯一約束命名,就默認(rèn)和列名相同
- MySQL會(huì)給唯一約束的列上默認(rèn)創(chuàng)建一個(gè)唯一索引
- 唯一約束可以使用表級(jí)約束的寫法,上述的非空約束是不可以的
添加唯一約束
# 表級(jí)約束寫法:
create table 表名稱(字段名 數(shù)據(jù)類型,[constraint 約束名] UNIQUE(字段名,字段名)
);# 1. 在創(chuàng)建表的時(shí)候添加唯一約束
CREATE TABLE test2
(id INT UNIQUE, # (這種就是列級(jí)寫法)name VARCHAR(10)
);# 2. 在創(chuàng)建表的時(shí)候使用表級(jí)約束寫法
CREATE TABLE test3
(id INT,name VARCHAR(10),CONSTRAINT id_uni UNIQUE(id)
);CREATE TABLE test4
(id INT,name VARCHAR(10),# 將id和name組合約束,表示只有當(dāng)id和name都重復(fù)才會(huì)報(bào)錯(cuò),否則都符合條件CONSTRAINT id_name_uni UNIQUE(id,name) # 多列約束
);# 3.在建表后添加唯一約束
ALTER TABLE test4
ADD UNIQUE(name);# 4.在建表后添加唯一約束
ALTER TABLE test3
MODIFY name VARCHAR(10) UNIQUE;
刪除唯一約束
上述說過因?yàn)?strong>添加唯一性約束的列上也會(huì)自動(dòng)創(chuàng)建唯一索引,所以刪除唯一約束只能通過刪除唯一索引
# 通過該命令可以查看指定表中有哪些約束
SELECT * FROM information_schema.table_constraints WHERE table_name = '表名'; # 也可以通過該命令查看表的索引
SHOW INDEX FROM 表名稱;ALTER TABLE test3
DROP INDEX id_uni
17.4 主鍵約束
主鍵約束相當(dāng)于唯一約束和非空約束的組合,主鍵約束列不允許重復(fù),也不允許出現(xiàn)空值, 注意:
- 一個(gè)表當(dāng)中最多只能由一個(gè)主鍵約束,建立主鍵約束可以在在列級(jí)創(chuàng)建,也可以在表級(jí)創(chuàng)建
- 主鍵約束可以對(duì)應(yīng)一列或者多列(和上述唯一約束中說的多列約束一樣)
- 主鍵約束不需要去取約束名,MySQL的主鍵名總是PRIMARY
- 創(chuàng)建主鍵約束時(shí), 系統(tǒng)默認(rèn)會(huì)在所在的列或列組合上建立對(duì)應(yīng)的主鍵索引,如果刪除主鍵約束了,主鍵約束對(duì)應(yīng)的索引就自動(dòng)刪除了。
添加主鍵約束
# 1. 創(chuàng)建表時(shí)添加主鍵約束
CREATE TABLE test1
(id INT PRIMARY KEY ,name VARCHAR(10)
);# 2. 創(chuàng)建表時(shí)添加主鍵約束(表級(jí)寫法)
CREATE TABLE test2
(id INT,name VARCHAR(10),PRIMARY KEY(id)
);CREATE TABLE test3
(id INT,name VARCHAR(10),PRIMARY KEY(id,name)
);# 3. 表創(chuàng)建后添加
ALTER TABLE test3
MODIFY id INT PRIMARY key;# 4. 表創(chuàng)建后添加
ALTER TABLE test4
ADD PRIMARY KEY(id);
刪除主鍵約束
ALTER TABLE test5
DROP PRIMARY KEY;
17.5 自增列約束
使用的要求:
- 一個(gè)表中只能有一個(gè)自增列
- 自增列約束必須是主鍵列或者唯一鍵列
- 約束列的數(shù)據(jù)類型必須是整數(shù)類型
- 如果自增列指定了 0 和 null,會(huì)在當(dāng)前最大值的基礎(chǔ)上自增;如果自增列手動(dòng)指定了具體值,直接賦值為具體值。
添加自增約束
# 1. 創(chuàng)建表時(shí)添加自增約束
CREATE TABLE test5
(id INT PRIMARY KEY auto_increment,name VARCHAR(10)
);INSERT INTO test5(name)
VALUES('a'),('b');# 2. 建表后添加自增約束
ALTER TABLE test6
MODIFY id INT auto_increment;
刪除自增約束
ALTER TABLE test6
MODIFY id INT;
17.6 外鍵約束
主表(父表):被引用的表,被參考的表
從表(子表):引用別人的表,參考別人的表
例如:員工表的員工所在部門這個(gè)字段的值要參考部門表:部門表是主表,員工表是從表。
注意點(diǎn):
- 如果想要指定外鍵約束的話,需要先創(chuàng)建主表,在創(chuàng)建從表
- 從表的外鍵列,必須參考主表中的主鍵列或者唯一約束列
- 從表外鍵列對(duì)應(yīng)主表的主鍵列或唯一約束列,二者數(shù)據(jù)類型必須要一致
- 刪除表的時(shí)候先刪除從表,再刪除主表
- 一個(gè)表可以建立多個(gè)外鍵約束
添加外鍵約束
# 語法:
create table 從表名稱(字段1 數(shù)據(jù)類型 primary key,字段2 數(shù)據(jù)類型,[CONSTRAINT <外鍵約束名稱>] FOREIGN KEY(從表的某個(gè)字段名) references 主表名 (被參考字段名)
);ALTER TABLE 從表名 ADD [CONSTRAINT 約束名] FOREIGN KEY (從表的某個(gè)字段名) REFERENCES 主表名(被引用字段名);# 1. 創(chuàng)建表時(shí)添加外鍵約束
CREATE TABLE dep
(d_id INT PRIMARY KEY,d_name VARCHAR(12)
);CREATE TABLE emp
(e_id INT PRIMARY KEY,e_name VARCHAR(10),department_id INT,FOREIGN KEY (department_id) REFERENCES dep(d_id)
);# 2. 建表后添加外鍵約束
ALTER TABLE emp
ADD FOREIGN KEY(department_id) REFERENCES dep(d_id) ;
刪除外鍵約束
# 第一步先查看約束名和刪除外鍵約束
SELECT * FROM information_schema.table_constraints WHERE table_name = '表名稱';ALTER TABLE 從表名 DROP FOREIGN KEY 外鍵約束名;# 第二步查看索引名和刪除索引
SHOW INDEX FROM 表名稱; #查看某個(gè)表的索引名ALTER TABLE 從表名 DROP INDEX 索引名;
約束關(guān)系是針對(duì)雙方的
- 添加了外鍵約束后,主表的修改和刪除數(shù)據(jù)受約束
- 添加了外鍵約束后,從表的添加和修改數(shù)據(jù)受約束
- 在從表上建立外鍵,要求主表必須存在
- 刪除主表時(shí),要求從表從表先刪除,或?qū)谋碇型怄I引用該主表的關(guān)系先刪除
17.7 默認(rèn)約束
給某個(gè)字段設(shè)置默認(rèn)值,如果此字段沒有顯式賦值,則賦值為默認(rèn)值。
添加默認(rèn)約束
# 1. 創(chuàng)建表時(shí)添加默認(rèn)約束
CREATE TABLE test1
(id INT PRIMARY KEY auto_increment,name VARCHAR(10),salary DECIMAL(10,2) NOT NULL DEFAULT 2000,gender CHAR DEFAULT '男'
);# 2. 建表后添加默認(rèn)約束
# 如果這個(gè)字段原來有非空約束,還想保留非空約束,那么在加默認(rèn)值約束時(shí),還得保留非空約束,否則非空約束就被刪除了,切記!!!!!!
ALTER table test2
MODIFY gender char(5) DEFAULT 'male' NOT NULL;
刪除默認(rèn)約束
ALTER table test2
MODIFY gender char(5) NOT NULL;
17.8 check約束
MySQL 5.7 不支持
check約束對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),看是否滿足預(yù)設(shè)的條件
CREATE TABLE test1
(id INT PRIMARY KEY,name VARCHAR(10),salary DECIMAL(10,2) CHECK(salary > 3000)
);
總結(jié)
以上就是今天要講的內(nèi)容,希望對(duì)大家有所幫助!!!