ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MySQL外键约束小记

MySQL外键约束小记 最近用AI编程做了一个小工具在删除某个实体时报错说违反数据库外键约束我才发现AI自动建表设计的外键太严格了于是顺便复习一下外键相关知识。按严格程度区分外键参照动作父表删/改时的行为严格程度MySQL 支持情况RESTRICT​只要子表还有关联行直接拒绝父表的删除/更新最严格✅ InnoDB 支持NO ACTION​标准 SQL 关键字在 MySQL 中与 RESTRICT等价立即检查并拒绝最严格✅ 支持等价于 RESTRICTSET NULL​允许操作父行把子表对应外键列置为 NULL该列必须允许 NULL中等✅ 支持SET DEFAULT​把子表外键列置为该列的默认值​中等⚠️ 解析器能识别但InnoDB 直接拒绝建表实际不可用CASCADE​父行删/改子行跟着删/改操作向外传播最宽松对数据影响最激进✅ 支持AI默认选择了RESTRICT模式想要实现直接删除实体不受外键引用的约束有两种选择1 选择SET NULL模式相关的表会把引用字段置空这种做法的好处是保留了相对完整的数据方便日后排查问题2CASCADE选择模式相关的表的记录会跟着删除这样数据比较干净不存在无用的数据。如何找到外键引用的表我看建表语句时发现ddl只能体现该表引用了哪些表做外键不知道哪些表引用了该表做外键。于是去系统表里查这个是“我”引用了谁在ddl也能看出来SELECT CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA DATABASE() AND TABLE_NAME data_templates AND REFERENCED_TABLE_NAME IS NOT NULL;这个是谁引用了“我”在ddl看不出来SELECT CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA DATABASE() AND REFERENCED_TABLE_NAME data_templates AND REFERENCED_TABLE_NAME IS NOT NULL;如何修改外键的严格程度没法直接修改需要删除再重建用上面的语句查到引用的表和字段再次安利一下这个数据库连接工具导出Excel很稳定鼠标悬浮还能直接出ddl非常方便。dbx同事推荐的一个数据库连接工具ALTER TABLE 子表名 DROP FOREIGN KEY 外键名; ALTER TABLE 子表名 ADD CONSTRAINT 外键名 FOREIGN KEY (子表外键列) REFERENCES 父表名 (父表列) ON DELETE CASCADE ON UPDATE CASCADE; ##demo ALTER TABLE execution_logs DROP FOREIGN KEY FK7fi6u6x7ug1chpiv7ctb9a83v; ALTER TABLE execution_logs ADD CONSTRAINT FK7fi6u6x7ug1chpiv7ctb9a83v FOREIGN KEY (data_template_id) REFERENCES data_templates (id) ON DELETE CASCADE ON UPDATE CASCADE;
返回列表