【问题标题】:How to rename both a primary key and a foreign key connected with each other?如何重命名相互连接的主键和外键?
【发布时间】:2020-01-10 14:41:23
【问题描述】:

我创建了两个表并想设置一个 one_to_many 关系。 我首先在表 'tappa' 上创建了一个主键 tappa_id,然后在表 low_cost_hotels 上创建了一个外键 tappa_id

然后我将表 tappa 的名称更改为 leg

我想重命名第一个表中的主键和引用它的第二个表中的外键,但我总是出错。我想知道问题是否是由于它们已经相互连接:

我写了以下代码来删除表中的主键legs-->

ALTER TABLE legs DROP COLUMN tappa_id ;

并收到此错误消息(FrancigenaApp 是包含表的数据库的名称)->

ERROR 1025 (HY000): Error on rename of './FrancigenaApp/#sql-33c0_26' to './FrancigenaApp/legs' (errno: 150)

我写了下面的代码来删除连接到表low_cost_hotels中前一个(tappa_id)的外键:

ALTER TABLE low_cost_hotels DROP FOREIGN KEY tappa_id;

并得到错误:

    ERROR 1025 (HY000): Error on rename of './FrancigenaApp/low_cost_hotels' to
 './FrancigenaApp/#sql2-33c0-27' (errno: 152)

我想我需要在重命名主键之前删除外键,但我不能这样做,而且这似乎不是 SQL 语法中的错误...

【问题讨论】:

  • 是的,您需要暂时删除外键,然后重命名列并创建新的外键。我发现当我需要这样做时,我会将数据库编写成一个 SQL 文件(包括模式和数据),然后编辑 SQL 文件并重新创建数据库。这解决了问题,并具有压缩新数据库的额外好处。
  • 使用SET FOREIGN_KEY_CHECKS = 0;。重命名列。然后SET FOREIGN_KEY_CHECKS = 1;

标签: mysql sql foreign-keys primary-key alter-table


【解决方案1】:

这对我有用,即使没有禁用外键检查:

初始架构:

create table parent (
  parent_id int,
  data text,
  primary key (parent_id)
);

create table child (
  child_id int,
  parent_id int,
  data text,
  primary key (child_id),
  foreign key (parent_id) references parent(parent_id)
);

insert into parent (parent_id, data) values (1, 'data');
insert into child (child_id, parent_id, data) values (1, 1, 'data');

在两个表中将parent_id 重命名为parent_id_new

alter table child change parent_id parent_id_new int;
alter table parent change parent_id parent_id_new int;

检查架构:

show create table parent;
show create table child;

结果是:

CREATE TABLE `parent` (
  `parent_id_new` int(11) NOT NULL,
  `data` text,
  PRIMARY KEY (`parent_id_new`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

CREATE TABLE `child` (
  `child_id` int(11) NOT NULL,
  `parent_id_new` int(11) DEFAULT NULL,
  `data` text,
  PRIMARY KEY (`child_id`),
  KEY `parent_id` (`parent_id_new`),
  CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id_new`) REFERENCES `parent` (`parent_id_new`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

View on DB Fiddle

在 MySQL 8 中你可以使用RENAME COLUMN 语法:

alter table child rename column parent_id to parent_id_new;
alter table parent rename column parent_id to parent_id_new;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2011-02-11
    • 2020-05-03
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多