我的数据库中有两个表,foo
和 bar
。多个 foo
具有一个 bar
,并包含第二列,用于控制具有相同 bar
的 foo
的排序>。用于排序的值应该是唯一的,因此表具有唯一约束:
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/