Mysql 使用外键约束更新值

Mysql 使用外键约束更新值,mysql,constraints,Mysql,Constraints,我对SQL有点陌生,所以我不确定我是否做了正确的事情。我有两张表是这样构建的: CREATE TABLE `TableA` ( `id_A` int(11) NOT NULL, `name` varchar(100) NOT NULL, PRIMARY KEY (`id_A`), UNIQUE KEY `name_UNIQUE` (`name`) ); CREATE TABLE `TableB` ( `id_B` int(11) NOT NULL, `id_A` in

我对SQL有点陌生,所以我不确定我是否做了正确的事情。我有两张表是这样构建的:

CREATE TABLE `TableA` (
  `id_A` int(11) NOT NULL,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY  (`id_A`),
  UNIQUE KEY `name_UNIQUE` (`name`)
);

CREATE TABLE `TableB` (
  `id_B` int(11) NOT NULL,
  `id_A` int(11) NOT NULL,
  PRIMARY KEY  (`id_B`),
  KEY `id_A` (`id_A`),
  CONSTRAINT `fk_id_A` FOREIGN KEY (`id_A`) REFERENCES `TableA` (`id_A`),
);
因此,这些表由字段id_A和表b中所示的约束链接。现在,由于一些外部原因,我必须更新TableA中字段id_A的一些值,当然我必须更新TableB中的相关行

我的第一次尝试是直接使用更新查询,但我得到了一个错误,说约束不允许更改,因为TableB(doh!)正在使用id_A:

错误代码:1451。无法删除或更新父行:外键 约束失败('myserver/TableB',约束'k_id_A'外键 ('id_A')引用了'TableA'('id_A'))

所以我的第一个想法是禁用约束,修改表并再次设置约束。然而,这意味着是一个设计用于编辑数据库中的某些东西的工具,我希望避免禁用(或删除)约束,因为有人可能会在更新的中间关闭工具或某些东西,而不使用它就离开表。 我一直在尝试使用一个包含我需要的查询的事务,而不是只执行几个查询,但是我仍然得到了前面的错误。到目前为止,我的想法是:

  • 删除约束,更新并再次设置约束
  • 使用新值复制TableA中的所有内容,更新TableB以使用TableA中的新值,并删除TableA中以前的条目
  • 获取所有内容,在数据库中删除所有内容,修改本地数据,然后将所有内容放回数据库
  • 有没有更好的办法? 我使用的是MySQL 5.0.27,为了测试我的查询(和事务),我使用的是MySQL Workbench 6.2


    谢谢大家。

    首先,编辑一行的ID键通常是个坏主意,但我不会质疑这一点

    您应该对约束使用
    CASCADE
    行为,更改当前表

    [...] CONSTRAINT `fk_id_A` FOREIGN KEY (`id_A`) REFERENCES `TableA` (`id_A`) ON UPDATE CASCADE
    
    [编辑]中有关此主题的详细信息