一、概念
對表中的數據進行限定,保證數據的正確性、有效性和完整性。
二、分類
1)、主鍵約束:primary key
2)、非空約束:not null
3)、唯一約束:unique
4)、外鍵約束:foreign key
三、非空約束
not null,某一列的值不能為null
1、創建表時添加約束
CREATE TABLE stu( id INT, NAME VARCHAR(20) NOT NULL -- name為非空 );
2、創建表完后,添加非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
3、刪除name的非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
四、唯一約束
unique,某一列的值不能重復
注意:唯一約束可以有NULL值,但是只能有一條記錄為null。
1、在創建表時,添加唯一約束
CREATE TABLE stu( id INT, phone_number VARCHAR(20) UNIQUE -- 手機號 );
2、刪除唯一約束
ALTER TABLE stu DROP INDEX phone_number;
3、在表創建完后,添加唯一約束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
五、主鍵約束
注意:
(1)、含義:非空且唯一
(2)、一張表只能有一個字段為主鍵
(3)、主鍵就是表中記錄的唯一標識
1、在創建表時,添加主鍵約束
create table stu( id int primary key,-- 給id添加主鍵約束 name varchar(20) );
2、刪除主鍵
-- 錯誤 alter table stu modify id int ; ALTER TABLE stu DROP PRIMARY KEY;
3、創建完表后,添加主鍵
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
4、自動增長
概念:如果某一列是數值類型的,使用 auto_increment 可以來完成值得自動增長
在創建表時,添加主鍵約束,並且完成主鍵自增長
create table stu( id int primary key auto_increment,-- 給id添加主鍵約束 name varchar(20) );
刪除自動增長
ALTER TABLE stu MODIFY id INT;
添加自動增長
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
六、外鍵約束
1、為什么要使用外鍵約束?
# 創建部門表 CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO dept (NAME) VALUES ('開發部'),('市場部'),('財務部'); # 創建員工表 CREATE TABLE emp ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), gender CHAR(1), -- 性別 salary DOUBLE, -- 工資 join_date DATE, -- 入職日期 dept_id INT ); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孫悟空','男',7200,'2013-02-24',1); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('豬八戒','男',3600,'2010-12-02',2); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);
emp表如下:

部門表如下:

此時如果我們刪除了開發部,
DELETE FROM dept WHERE id = 1;
雖然刪除了開發部,但是這是不合適的,因為孫悟空和蜘蛛精都屬於開發部,此時開發部還有人,故不應該刪除開發部,如果刪除的話,數據就不完整不正確了。
我們使用外鍵約束可以解決這個問題。讓emp表的dept_id關聯dept表的主鍵id即可。
我們添加外鍵
TRUNCATE TABLE emp;
ALTER TABLE emp ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dept_id) REFERENCES dept(id);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孫悟空','男',7200,'2013-02-24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('豬八戒','男',3600,'2010-12-02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);
注意:要先刪除數據才能添加外鍵。
此時刪除開發部

此時,如果你想在emp表中添加一條記錄而且dept_id不存在,如dept_id為4,則無法添加,因為有外鍵約束。
注意:外鍵可以為null,但不能為不存在的外鍵值。
2、foreign key,讓表於表產生關系,從而保證數據的正確性。
1、在創建表時,可以添加外鍵
語法
create table 表名(
....
外鍵列
constraint 外鍵名稱 foreign key (外鍵列名稱) references 主表名稱(主表列名稱)
);
2、刪除外鍵
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;
3、創建表之后,添加外鍵
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段名稱) REFERENCES 主表名稱(主表列名稱);
七、級聯操作
分類:
1)、級聯更新:ON UPDATE CASCADE
2)、級聯刪除:ON DELETE CASCADE
1、為什么要添加級聯操作?
現在兩個表emp和dept,如下所示:


如果我們想把開發部的id改為4,則提示如下:

我們也可以將emp表中id為1的dept_id先改為null,再修改dept表中開發部的id為4,再將dept_id為null的記錄改為dept_id為4.
UPDATE emp SET dept_id = NULL WHERE dept_id = 1; UPDATE emp SET dept_id = 4 WHERE dept_id IS NULL;
但是這個操作很麻煩,那能不能當我們修改了dept表的主鍵id的值,然后emp表的相關的dept_id自動修改了呢?用級聯操作可以解決。
我們先刪除外鍵
ALTER TABLE emp DROP FOREIGN KEY emp_dept_fk;
2、級聯更新
添加外鍵時添加級聯操作
語法
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段名稱) REFERENCES 主表名稱(主表列名稱) ON UPDATE CASCADE ON DELETE CASCADE;
此時,如果修改dept表的id,那么emp表的dept_id自動修改。
3、級聯刪除
如果在dept表中刪除id為1的開發部,那么會自動刪除emp表中dept_id為1的數據。
注意:級聯刪除要慎用,級聯刪除很危險,有可能刪除很多數據。
