mysql - 使用唯一约束更新多行

标签 mysql sql constraints

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

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)
);

更新一个栏的 foo 顺序的最有效方法是什么?例如,如果我有以下数据:

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;

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

最佳答案

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

新查询

 ID   newOrder
 3      4
 4      3

由于完整性限制,您在更新之前将订单更新为 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

关于mysql - 使用唯一约束更新多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33414638/

相关文章:

mysql - 两个表之间的 SQL 约束

php - laravel 查询多对多

sql - 为什么我的导航属性在 Entity Framework 4 中为空?

ios - UIView 上的 UIStoryboard 约束

mysql - 我的模型的数据建模、约束和问题

php - 使用 PHP 从 MySQL 填充 HTML 表单

mysql - 声明错误处理程序在 MySQL 中无效?

php - 通过 PHP 以当前日期命名数据库表

sql - ORA-00942:表或 View 不存在(当使用单独的sql时有效,但在oracle函数中不起作用)

python - 控制洗牌距离