2

这是我正在尝试做的基本要点:

create table main(id char(1) primary key);

create table other (
  id int primary key auto_increment,
  main_id char(1),
  key m (main_id),
  constraint fk foreign key (main_id) references main(id)
);

insert into main(id) values('a');
insert into other(main_id) values('a');

update main inner join other on other.main_id=main.id
set main.id='b', other.main_id='b'
where main.id='a';

这会导致外键约束失败。有什么方法可以在不删除外键的情况下完成此操作(在我的大型生产数据库中并不是一个真正的选项)?

4

1 回答 1

2

您可以通过foreign_key_checks=0在会话中临时设置来做到这一点:

set foreign_key_checks=0;

update main inner join other on other.main_id=main.id
set main.id='b', other.main_id='b'
where main.id='a';

另一个选项是使用该选项配置外键,ON UPDATE CASCADE以便如果主键在父表上更新,它将级联到子表:

create table main(id char(1) primary key);

create table other (
  id int primary key auto_increment,
  main_id char(1),
  key m (main_id),
  constraint fk foreign key (main_id) references main(id) on update cascade
);
于 2013-08-21T14:51:31.547 回答