MySQL外鍵操做

筆記:設置外鍵FOREIGN KEY測試

-----------------------------------在建表時設置了外鍵----------------------------------------
建立主表tb_train_fk11:
CREATE TABLE IF NOT EXISTS tb_train_fk11(
cid TINYINT UNSIGNED KEY AUTO_INCREMENT,
cname VARCHAR(5) NOT NULL UNIQUE,
population INT UNSIGNED NOT NULL,
area FLOAT(5,2)
)AUTO_INCREMENT=101 ENGINE=INNODB CHARSET=UTF8;
INSERT tb_train_fk11(cname,population,area) VALUES
('魏國',2580,786.24),
('蜀國',1200,295.18),
('吳國',1845,513.72);
建立子表tb_train_fk12:
CREATE TABLE IF NOT EXISTS tb_train_fk12(
userid INT UNSIGNED KEY AUTO_INCREMENT,
username VARCHAR(10) NOT NULL UNIQUE,
age TINYINT UNSIGNED DEFAULT 18,
sex ENUM('男','女') NOT NULL,
country_id TINYINT UNSIGNED,
CONSTRAINT 11_fk_12 FOREIGN KEY(country_id) REFERENCES tb_train_fk11(cid)
)ENGINE=INNODB CHARSET=UTF8;
INSERT tb_train_fk12(username,age,sex,country_id) VALUES
('張飛',36,'男',102),
('劉備',48,'男',102),
('孫尚香',28,'女',103),
('甄姬',30,'女',101),
('黃月英',28,'女',102),
('夏侯惇',35,'男',101),
('黃忠',40,'男',102),
('張馨',26,'女',101),
('郭嘉',24,'男',101),
('太史慈',32,'男',103),
('小喬',30,'女',103),
('趙子龍',22,'男',102),
('曹羨',34,'女',101),
('大喬',31,'女',103),
('周瑜',38,'男',103),
('曹操',50,'男',101),
('關鳳',25,'女',102),
('馬超',28,'男',102);ci

注意:因爲有外鍵的約束,直接刪除主表tb_train_fk11中的記錄(如cid=101)
DELETE FROM tb_train_fk11 WHERE cid=101;
WARING:Cannot delete or update a parent row: a foreign key constraint fails數學

方法:先刪除子表tb_train_fk12中cid=101的記錄,在刪除主表tb_train_fk11中的記錄cid=101
DELETE FROM tb_train_fk12 WHERE country_id=101;
DELETE FROM tb_train_fk11 WHERE cid=101;
SELECT * FROM tb_train_fk11;
SELECT * FROM tb_train_fk12;
 io

-----------------------------------在建表後設置外鍵----------------------------------------
主表:
CREATE TABLE IF NOT EXISTS tb_train_fk11(
cid TINYINT UNSIGNED KEY AUTO_INCREMENT,
cname VARCHAR(5) NOT NULL UNIQUE,
population INT UNSIGNED NOT NULL,
area FLOAT(5,2)
)AUTO_INCREMENT=101 ENGINE=INNODB CHARSET=UTF8;
INSERT tb_train_fk11(cname,population,area) VALUES
('魏國',2580,786.24),
('蜀國',1200,295.18),
('吳國',1845,513.72);
子表:
CREATE TABLE IF NOT EXISTS tb_train_fk12(
userid INT UNSIGNED KEY AUTO_INCREMENT,
username VARCHAR(10) NOT NULL UNIQUE,
age TINYINT UNSIGNED DEFAULT 18,
sex ENUM('男','女') NOT NULL,
country_id TINYINT UNSIGNED
)ENGINE=INNODB CHARSET=UTF8;
INSERT tb_train_fk12(username,age,sex,country_id) VALUES
('張飛',36,'男',102),
('劉備',48,'男',102),
('孫尚香',28,'女',103),
('甄姬',30,'女',101),
('黃月英',28,'女',102),
('夏侯惇',35,'男',101),
('黃忠',40,'男',102),
('張馨',26,'女',101),
('郭嘉',24,'男',101),
('太史慈',32,'男',103),
('小喬',30,'女',103),
('趙子龍',22,'男',102),
('曹羨',34,'女',101),
('大喬',31,'女',103),
('周瑜',38,'男',103),
('曹操',50,'男',101),
('關鳳',25,'女',102),
('馬超',28,'男',102);date

添加外鍵:ALTER TABLE tb_train_fk12 ADD CONSTRAINT 11_fk_12 FOREIGN KEY(country_id) REFERENCES tb_train_fk11(cid);
刪除外鍵:ALTER TABLE tb_train_fk12 DROP FOREIGN KEY 11_fk_12;方法


-----------------------------------外鍵約束----------------------------------------
外鍵約束的參照操做:
-CASCADE:刪除更新主表記錄時自動刪除更新子表中匹配的行
-SET NULL:主表刪除更新行,並設置子表中的外鍵列爲NULL(前提是保證子表中數據不是NOT NULL)
-RESTRICT:拒絕對主表進行刪除或更新記錄
-NO ACTION:與RESTRICT相同數據

------測試CASCADE------
建立主表tb_department
CREATE TABLE IF NOT EXISTS tb_department(
dId INT UNSIGNED KEY AUTO_INCREMENT,
dName VARCHAR(20) NOT NULL UNIQUE
)ENGINE=INNODB;
INSERT tb_department(dName) VALUES
('數學院'),
('經濟院'),
('化學院'),
('物理院'),
('文學院'),
('機械學院');
建立子表tb_stu
CREATE TABLE IF NOT EXISTS tb_stu(
userId INT UNSIGNED KEY AUTO_INCREMENT,
userName VARCHAR(10) NOT NULL,
dId INT UNSIGNED NOT NULL,
CONSTRAINT emp_stu FOREIGN KEY(dId) REFERENCES tb_department(dId) ON DELETE CASCADE ON UPDATE CASCADE
)AUTO_INCREMENT=2018000 ENGINE=INNODB;
INSERT tb_stu(userName,dId) VALUES
('路飛',5),
('漢庫克',2),
('鷹眼',1),
('多佛朗明哥',3),
('巴基',2),
('佐羅',4),
('羅賓',6),
('達斯琪',1),
('赤犬',3),
('青雉',5),
('紅髮',1),
('黃猿',4);
其中:
外鍵約束:ON DELETE CASCADE:刪除主表同時刪除子表中相關的記錄
ON UPDATE CASCADE:更新主表同時更新子表中相關的記錄

DELETE FROM tb_department WHERE dId=1;
SELECT * FROM tb_department;
SELECT * FROM tb_stu;co


------測試RESTRICT------
先刪除主表和子表:
DROP TABLE tb_stu[必須先刪除子表,不然主表不能刪除]
DROP TABLE tb_stulet

建立主表tb_department
CREATE TABLE IF NOT EXISTS tb_department(
dId INT UNSIGNED KEY AUTO_INCREMENT,
dName VARCHAR(20) NOT NULL UNIQUE
)ENGINE=INNODB;
INSERT tb_department(dName) VALUES
('數學院'),
('經濟院'),
('化學院'),
('物理院'),
('文學院'),
('機械學院');
建立子表tb_stu
CREATE TABLE IF NOT EXISTS tb_stu(
userId INT UNSIGNED KEY AUTO_INCREMENT,
userName VARCHAR(10) NOT NULL,
dId INT UNSIGNED NOT NULL,
CONSTRAINT emp_stu FOREIGN KEY(dId) REFERENCES tb_department(dId) ON DELETE RESTRICT ON UPDATE RESTRICT
)AUTO_INCREMENT=2018000 ENGINE=INNODB;
INSERT tb_stu(userName,dId) VALUES
('路飛',5),
('漢庫克',2),
('鷹眼',1),
('多佛朗明哥',3),
('巴基',2),
('佐羅',4),
('羅賓',6),
('達斯琪',1),
('赤犬',3),
('青雉',5),
('紅髮',1),
('黃猿',4);
其中:
外鍵約束:ON DELETE RESTRICT:拒絕對主表進行刪除操做
ON UPDATE RESTRICT:拒絕對主表進行更新操做

DELETE FROM tb_department WHERE dId=2;
WARNING:Cannot delete or update a parent row: a foreign key constraint failsdelete

相關文章
相關標籤/搜索