Наличие таблицы, содержащей некоторые настройки пользовательского интерфейса для таблицы данных, обычно такие как:
| 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 |
Здесь pos
может быть обновлено пользователем путем перетаскивания столбцов в графическом интерфейсе.
Поскольку name
и id
уникальны, и я обновляю несколько строк одновременно. I используйте 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
а также один столбец не может иметь одинаковую позицию. Невозможно установить одно и то же значение столбца в пользовательском интерфейсе, но было бы неплохо иметь ограничения, поскольку они являются уникальными и ... хорошо, чтобы учиться.
Задача тогда Становится так, что если вы попытаетесь использовать KEY UPDATE
, то столкнетесь с конфликтами при замене двух значений. Таким образом, я не могу сказать pos = VALUES(pos)
, когда существует 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)
Как go о том, как это сделать?
Небольшие мысли:
- Некоторые запросы волхвов c?
- Использовать временную копию таблицы без ограничений очистить и заполнить ?
- Сначала удалить рассматриваемые записи, а затем вставить?
- Отменить ограничение на время вставки, а затем повторно применить?
- ...