MySQL查出所有的主外键关系、级联关系,并记录起来,删除所有的外键关系,根据记录重新建立外键关系
- 查出所有的主外键关系并记录起来
可以通过查询information_schema数据库中的REFERENTIAL_CONSTRAINTS表来获取所有的主外键关系。以下是查询语句:
`
SELECT
K.CONSTRAINT_NAME, -- 外键约束名
K.TABLE_NAME, -- 子表外键所在表名
K.COLUMN_NAME, -- 外键所在列名
K.REFERENCED_TABLE_NAME, -- 主表主键所在表名
K.REFERENCED_COLUMN_NAME,-- 主键所在列名
R.UPDATE_RULE,-- 修改规则
R.DELETE_RULE-- 删除规则
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE K
LEFT JOIN information_schema.REFERENTIAL_CONSTRAINTS R ON K.CONSTRAINT_NAME = R.CONSTRAINT_NAME
WHERE
K.REFERENCED_TABLE_SCHEMA = 'test' -- 数据库名
AND K.REFERENCED_TABLE_NAME IS NOT NULL;
`
2. 将查询结果记录下来,可以通过导出成csv或者直接复制到文本文件中。
或者根据上边查询的结果、生成新建外键关系的DDL
`
--重新建立索引的DDl
SELECT
CONCAT('ALTER TABLE ', TABLE_NAME, ' ADD CONSTRAINT ', CONSTRAINT_NAME, ' FOREIGN KEY ', '\(', COLUMN_NAME, '\)', ' REFERENCES ', REFERENCED_TABLE_NAME, ' \(',REFERENCED_COLUMN_NAME,'\)', ' ON UPDATE ', UPDATE_RULE, ' ON DELETE ', DELETE_RULE,';')
FROM
(SELECT
K.CONSTRAINT_NAME, -- 外键约束名
K.TABLE_NAME, -- 外键所在表名
K.COLUMN_NAME, -- 外键所在列名
K.REFERENCED_TABLE_NAME, -- 主键所在表名
K.REFERENCED_COLUMN_NAME,-- 主键所在列名
R.UPDATE_RULE,-- 修改规则
R.DELETE_RULE-- 删除规则
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE K
LEFT JOIN information_schema.REFERENTIAL_CONSTRAINTS R ON K.CONSTRAINT_NAME = R.CONSTRAINT_NAME
WHERE
K.REFERENCED_TABLE_SCHEMA = 'test' -- 数据库名
AND K.REFERENCED_TABLE_NAME IS NOT NULL) AS X
`
- 删除所有外键关系
可以通过以下语句来删除所有外键关系:
`
SELECT
CONCAT('ALTER TABLE ', TABLE_NAME, ' DROP FOREIGN KEY ', CONSTRAINT_NAME, ';')
FROM
information_schema.REFERENTIAL_CONSTRAINTS
WHERE
CONSTRAINT_SCHEMA = 'test';
`
执行以上语句会生成一系列的ALTER TABLE语句,将这些语句复制粘贴到MySQL客户端中执行即可删除所有的外键关系。
- 根据记录重新建立外键关系
根据记录重新建立外键关系需要使用之前记录的数据,以下是一个示例:
`
ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (column_name) REFERENCES referenced_table_name (referenced_column_name) ON UPDATE update_rule ON DELETE delete_rule;
ALTER TABLE je_test_change_key ADD CONSTRAINT JE_1677033854506 FOREIGN KEY (ID) REFERENCES zibiaob (ZIBIAOB_WJ) ON UPDATE CASCADE ON DELETE CASCADE;
`
其中,table_name为外键所在的表名,constraint_name为外键的名称,column_name为外键所在的列名,referenced_table_name为被引用的表名,referenced_column_name为被引用的列名。同时,我们还指定了ON UPDATE和ON DELETE规则,用于指定级联操作的规则。
需要注意的是,重新建立外键关系时,需要先创建被引用的表和列,否则会出现错误。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本