【发布时间】:2020-03-27 08:05:48
【问题描述】:
拥有一个包含数据表的一些 UI 设置的表,通常如下:
| ID | name | alias | pos | def_pos | disp |
+-----+--------+-------+--------+---------+------+
| 1 | name1 | bar | 1 | 1 | 1 |
| 2 | name2 | foo | 3 | 2 | 1 |
| 3 | name3 | bar | 2 | 3 | 1 |
| 4 | name4 | baz | 4 | 4 | 0 |
- ID:主要
- 名称:唯一
这里pos可以由用户通过在图形界面中拖动列来更新。
由于name 和id 是唯一的,我一次更新多行 我在更改值时使用INSERT 和ON DUPLICATE KEY UPDATE 而不是UPDATE。因此,例如,如果从上面的示例中交换第 2 行和第 3 行:
INSERT INTO
ui_data_columns (id, name, pos)
VALUES
(2, '', 2),
(3, '', 3)
ON DUPLICATE KEY UPDATE
pos = VALUES(pos)
根据:
到目前为止一切顺利:P
现在我的想法是为pos 和def_pos 添加唯一约束,并且一列不能有相同的位置。不可能在 UI 中将两个列值设置为相同,但最好有约束,因为它们是唯一的并且......嗯,学习。
挑战就变成了,如果尝试使用KEY UPDATE,则在交换两个值时会遇到冲突。因此,当pos 存在时,我不能说pos = VALUES(pos) - 即使它在同一个语句中得到纠正(如果你明白我的意思的话)。假设它们通常按顺序插入:
INSERT INTO ui_data_columns (id, name, pos)
VALUES (2, '', 2)
ON DUPLICATE KEY UPDATE pos = VALUES(pos)
# Error: pos = 2 exists
即使这个修复是:
INSERT INTO ui_data_columns (id, name, pos)
VALUES (3, '', 3)
ON DUPLICATE KEY UPDATE pos = VALUES(pos)
这要怎么做?
小想法:
- 一些查询魔法?
- 使用没有约束的临时表副本清除和填充?
- 先删除有问题的记录再插入?
- 在插入期间删除约束然后重新应用?
- ...
【问题讨论】:
-
INSERT .. ODKU仅逐个插入/更新记录,而重新排列需要同时更新两条记录(或使用一些中间存储)。我不明白你为什么在需要更新时使用 INSERT .. ODKU... -
作为一个技巧,您可以尝试使用三重更新 - 在
I..ODKU中使用VALUES (2, '', -1), (3, '', 3), (2, '', 2)... -
@Akina:我按照stackoverflow.com/a/34866431使用INSERT
标签: mysql