約束:主鍵、非空、唯一、外鍵


一、概念

對表中的數據進行限定,保證數據的正確性、有效性和完整性。

二、分類

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的數據。

注意:級聯刪除要慎用,級聯刪除很危險,有可能刪除很多數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM