約束:對錶中的數據進行限定,保證數據的正確性、有效性和完整性。
如果給表中添加了一條數據,年齡字段有值, 而姓名字段無值,這樣的數據不太好,所以要對數據庫表做約束。
分類:
1.主鍵約束:primary key
1.注意:
1.含義:非空且唯一。
2.一張表只能有一個字段爲主鍵。
3.主鍵就是表中記錄的唯一標識。
4.自動增長:
概念:如果某一列是數值類型的,使用auto_increment可以完成值得自動增長。
CREATE TABLE stu3 (
id INT PRIMARY KEY AUTO_INCREMENT, -- 給id添加主鍵約束
NAME VARCHAR(20)
)
-- 刪除自動增長
ALTER TABLE stu MODIFY id INT;
-- 添加自動增長
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
CREATE TABLE stu1(
id INT PRIMARY KEY, -- 給id添加主鍵約束
NAME VARCHAR(20)
)
-- 刪除主鍵
-- alter table stu1 modify id int; // 錯的
ALTER TABLE stu1 DROP PRIMARY KEY;
-- 創建完表後,添加主鍵
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
SELECT * FROM stu1;
2.非空約束:not null
-- 創建表添加非空約束
CREATE TABLE yueshu (
id INT, -- 編號
NAME VARCHAR(20) NOT NULL -- name 爲非空
);
-- 刪除name的非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
-- 創建表完成後,添加非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
SELECT * FROM stu;
3.唯一約束:unique (那一列的數據不能有重複,比如說電話號碼等)
CREATE TABLE stu (
id INT,
phone_number VARCHAR(20) UNIQUE -- 添加了唯一約束
);
-- 注意mysql中,唯一約束限定的列的值可以有多個null
-- 刪除唯一約束
-- ALTER TABLE stu MODIFY phone_number VARCHAR(20); // 沒用
ALTER TABLE stu DROP INDEX phone_number;
-- 在創建表後,添加唯一約束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
4.外鍵約束:foreign key 讓表與表產生關係,從而保證數據的正確性。
1.在創建表時,可以添加外鍵。
*語法:
create table 表名(
...
外鍵列
constraint 外鍵名稱 foreign key (外鍵列名稱) references 主表名稱(主表列名稱)
)
新建兩張表:
部門表:
人員表:
比如說現在需要撤銷廣州的研發部,但是人員表裏面的前三個人信息就是歸屬於研發部的,這樣數據就不符合邏輯了。
如下給員工表添加外鍵。可以保證部門可以不被隨意刪除。
-- 解決方案:分成 2 張表
-- 創建部門表(id,dep_name,dep_location)
-- 一方,主表
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
dep_name VARCHAR(20),
dep_location VARCHAR(20)
);
-- 創建員工表(id,name,age,dep_id)
-- 多方,從表
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT,
CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id)
);
刪除外鍵:
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;
-- 刪除外鍵
ALTER TABLE employee DROP FOREIGN KEY emp_dept_fk;
添加外鍵
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段名稱) REFERENCES department(主列表名稱);
-- 添加外鍵
ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id);
約束級聯操作
需求:想改某個部門的id,則其他關聯這個id的數據也要變化纔行,否則就有歧義。
笨辦法:
1.現將關聯數據的部門字段變爲null (UPDATE employee SET dep_id = NULL WHERE dep_id = 1;)
2.手動將部門表的id修改掉:
3.再將員工表dep_id爲null的變爲5
UPDATE employee SET dep_id = 5 WHERE dep_id IS NULL;
上面這個笨辦法太麻煩了,想着修改部門id,則關聯的數據會跟着變化。
可以添加外鍵過程中設置級聯更新 就是部門id變了 員工的部門id也會跟着變
-- 添加外鍵,並設置級聯更新
ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id) ON UPDATE CASCADE;
可以添加外鍵過程中設置級聯更新 就是部門id變了 員工的部門id也會跟着變,刪除了部門,則員工也會跟着刪除
ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id) ON UPDATE CASCADE ON DELETE CASCADE;
這種級聯刪除的操作其實有利有弊。