有一个简单的方法,但它涉及删除旧外键并创建新外键。
这是一个演示:
mysql> create table foo (id serial primary key);
mysql> create table bar (foo_id bigint unsigned, foreign key (foo_id) references foo(id));
重命名表后,外键引用会自动更新以跟随重命名的表:
mysql> rename table foo to old_foo;
mysql> show create table bar\G
*************************** 1. row ***************************
Table: bar
Create Table: CREATE TABLE `bar` (
`foo_id` bigint(20) unsigned DEFAULT NULL,
KEY `foo_id` (`foo_id`),
CONSTRAINT `bar_ibfk_1` FOREIGN KEY (`foo_id`) REFERENCES `old_foo` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
创建新表后:
mysql> create table foo like old_foo;
我们可以通过以下方式重新定义外键:
mysql> alter table bar
drop foreign key bar_ibfk_1,
add foreign key (foo_id) references foo(id);
现在表引用了新表:
mysql> show create table bar\G
*************************** 1. row ***************************
Table: bar
Create Table: CREATE TABLE `bar` (
`foo_id` bigint(20) unsigned DEFAULT NULL,
KEY `foo_id` (`foo_id`),
CONSTRAINT `bar_ibfk_2` FOREIGN KEY (`foo_id`) REFERENCES `foo` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
如果您有很多外键,您可以通过查询 INFORMATION_SCHEMA、表 TABLE_CONSTRAINTS 和 KEY_COLUMN_USAGE 来发现它们的列表。从此元数据中,您可以构建 ALTER TABLE 语句来更改外键。