使用外键约束更新值

时间:2014-12-29 13:47:21

标签: 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` 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中的关联行。

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

  

错误代码:1451。无法删除或更新父行:外键   约束失败(' myserver / TableB',CONSTRAINT' k_id_A' FOREIGN KEY   (' id_A')参考'表A' (' ID_A'))

所以我的第一个想法是禁用约束,修改表并再次设置约束。但是,这应该是用于编辑数据库中某些东西的工具的一部分,我想避免禁用(或删除)约束,因为有人可能会在更新过程中关闭该工具或者其他东西而离开表格没有它。

我一直在尝试使用包含我需要的查询的交易,而不仅仅是进行多次查询,但我仍然收到了之前的错误。到目前为止,我的想法是:

  1. 删除约束,再次更新并设置约束。
  2. 使用新值复制TableA中的所有内容,更新TableB以使用TableA中的新值并删除TableA中的先前条目。
  3. 获取所有内容,删除db中的所有内容,修改本地数据,然后将所有内容放回数据库中。
  4. 有没有更好的方法呢? 我正在使用MySQL 5.0.27并使用MySQL Workbench 6.2来测试我的查询(和事务)。

    谢谢大家。

1 个答案:

答案 0 :(得分:1)

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

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

[...] CONSTRAINT `fk_id_A` FOREIGN KEY (`id_A`) REFERENCES `TableA` (`id_A`) ON UPDATE CASCADE

[edit] this question中有关此主题的更多信息。