【问题标题】:Update multiple rows with unique constraint使用唯一约束更新多行
【发布时间】:2015-10-29 12:45:28
【问题描述】:

我的数据库中有两个表,foobar。多个foos 有一个bar,并包含第二列控制foos 与相同bar 的顺序。用于排序的值应该是唯一的,因此该表具有唯一约束:

CREATE TABLE bar (
  id int NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (id)
);

CREATE TABLE foo (
  id INT NOT NULL AUTO_INCREMENT,
  bar INT,
  `order` INT,
  PRIMARY KEY (id),
  FOREIGN KEY (bar) REFERENCES bar (id),
  UNIQUE KEY (bar, order)
);

更新foos 的顺序的最有效方法是什么?例如,如果我有这些数据:

id | bar | order
 1 |  1  |   1
 2 |  1  |   2
 3 |  1  |   3
 4 |  1  |   4

并且想要重新排序它们(1、2、4、3),我现在有以下查询:

UPDATE foo SET `order` = NULL WHERE id IN (3, 4);
UPDATE foo SET `order` = 3 WHERE id = 4;
UPDATE foo SET `order` = 4 WHERE id = 3;

第一个查询对于防止其他更新出现完整性错误是必要的。这可以改进吗?

【问题讨论】:

标签: mysql sql constraints


【解决方案1】:

我唯一能想到的是您应该将更新值放在单独的表/查询中,以使其更通用并且可以使用多个 ID

新查询

 ID   newOrder
 3      4
 4      3

由于完整性限制,您在更新前将 order 更新为 null。

 UPDATE foo SET `order` = NULL WHERE id IN (SELECT ID FROM newQuery);

然后用JOIN更新

UPDATE foo AS f
INNER JOIN newQuery AS n ON f.id = n.id
SET f.order = n.newOrder

【讨论】:

    猜你喜欢
    • 2017-01-10
    • 2015-12-17
    • 1970-01-01
    • 2015-12-10
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 2011-09-12
    相关资源
    最近更新 更多