|
-- 1.6 外鍵約束
-- 員工表
CREATE TABLE employee(
id INT PRIMARY KEY,
empName VARCHAR(20),
deptName VARCHAR(20) -- 部門名稱
)
INSERT INTO employee VALUES(1,‘張三‘,‘軟體開發部‘);
INSERT INTO employee VALUES(2,‘李四‘,‘軟體開發部‘);
INSERT INTO employee VALUES(3,‘王五‘,‘應用維護部‘);
SELECT * FROM employee;
-- 添加員工,部門名稱的資料冗餘高
INSERT INTO employee VALUES(4,‘陳六‘,‘軟體開發部‘);
-- 解決資料冗餘高的問題:給冗餘的欄位放到一張獨立表中
-- 獨立設計一張部門表
CREATE TABLE dept(
id INT PRIMARY KEY,
deptName VARCHAR(20)
)
DROP TABLE employee;
-- 修改員工表
CREATE TABLE employee(
id INT PRIMARY KEY,
empName VARCHAR(20),
deptId INT,-- 把部門名稱改為部門ID
-- 聲明一個外鍵約束
CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE -- ON CASCADE UPDATE :級聯修改
-- 外鍵名稱 外鍵 參考表(參考欄位)
)
INSERT INTO dept(id,deptName) VALUES(1,‘軟體開發部‘);
INSERT INTO dept(id,deptName) VALUES(2,‘應用維護部‘);
INSERT INTO dept(id,deptName) VALUES(3,‘秘書部‘);
INSERT INTO employee VALUES(1,‘張三‘,1);
INSERT INTO employee VALUES(2,‘李四‘,1);
INSERT INTO employee VALUES(3,‘王五‘,2);
INSERT INTO employee VALUES(4,‘陳六‘,3);
-- 問題: 該記錄業務上不合法,員工插入了一個不存在的部門資料
INSERT INTO employee VALUES(5,‘陳六‘,4); -- 違反外鍵約束: Cannot add or update a child row: a foreign key constraint fails (`day16`.`employee`, CONSTRAINT `emlyee_dept_fk` FOREIGN KEY (`deptId`) REFERENCES `dept` (`id`))
-- 1)當有了外鍵約束,添加資料的順序: 先添加主表,再添加副表資料
-- 2)當有了外鍵約束,修改資料的順序: 先修改副表,再修改主表資料
-- 3)當有了外鍵約束,刪除資料的順序: 先刪除副表,再刪除主表資料
-- 修改部門(不能直接修改主表)
UPDATE dept SET id=4 WHERE id=3;
-- 先修改員工表
UPDATE employee SET deptId=2 WHERE id=4;
-- 刪除部門
DELETE FROM dept WHERE id=2;
-- 先刪除員工表
DELETE FROM employee WHERE deptId=2;
SELECT * FROM dept;
SELECT * FROM employee; |