关系型数据库中表之间存在约束关系,因此在对两表存在关联的数据进行更新删除操作时,会报错。可采用以下三种策略操作:
策略1:NO ACTION,通过操作SQL完成
策略2:CASCADE 级联操作:操作主表时影响从表的外键信息
策略3:SET NULL 置空操作:将从表信息更新为NULL(相比于策略2更稳)
注意:策略2-3可混用,如ON UPDATE CASCADE ON DELETE SET NULL
-- 从表数据依赖于主表,当有外键约束,直接删除从表会引起报错,故先删主表,再删从表
/*外键策略
策略1:NO ACTION,通过操作SQL完成
策略2:CASCADE 级联操作:操作主表时影响从表的外键信息
策略3:SET NULL 置空操作:将从表信息更新为NULL(相比于策略2更稳)
注意:策略2-3可混用,如ON UPDATE CASCADE ON DELETE SET NULL
*/
-- 查看表中数据
SELECT * FROM t_students_1;
-- 策略1:先修改从表中信息,再删除主表
UPDATE t_students_1 set classn = NULL
WHERE age = 20;
DELETE FROM t_class
WHERE class = 4;
-- 策略2:更新其中主表外键信息,从表关联项跟着改变
-- 先删除原有外键信息
ALTER TABLE t_students_1 DROP FOREIGN KEY fk_stus1_classn;
-- 再重新添加外键约束,并定义级联操作
ALTER TABLE t_students_1 ADD
CONSTRAINT fk_stus1_classn FOREIGN KEY(classn) REFERENCES t_class(cnu)
ON UPDATE CASCADE ON DELETE CASCADE;
-- 尝试更新数据(此时可行)
UPDATE t_class set class = 6
WHERE class = 4;
-- 尝试删除数据(此时可行)
DELETE FROM t_class WHERE class = 6;
-- 策略3:置空操作
-- 先删除原有外键信息
ALTER TABLE t_students_1 DROP FOREIGN KEY fk_stus1_classn;
-- 再重新添加外键约束,并定义级联操作
ALTER TABLE t_students_1 ADD
CONSTRAINT fk_stus1_classn FOREIGN KEY(classn) REFERENCES t_class(cnu)
ON UPDATE SET NULL ON DELETE SET NULL;
-- 尝试更新数据(此时可行)
UPDATE t_class set class = 6
WHERE class = 4;