ОБНОВЛЕНИЕ DUPLICATE KEY с уникальными столбцами - PullRequest
0 голосов
/ 27 марта 2020

Наличие таблицы, содержащей некоторые настройки пользовательского интерфейса для таблицы данных, обычно такие как:

| 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: PRIMARY
  • name: UNIQUE

Здесь 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?
  • Использовать временную копию таблицы без ограничений очистить и заполнить ?
  • Сначала удалить рассматриваемые записи, а затем вставить?
  • Отменить ограничение на время вставки, а затем повторно применить?
  • ...

1 Ответ

1 голос
/ 27 марта 2020

Трюк - используйте промежуточный. Т.е. выполнить 3 обновления, а не 2.

create table test (id int primary key, pos int unique);
insert into test values (1,1),(2,3),(3,2),(4,4);
select * from test;
id | pos
-: | --:
 1 |   1
 3 |   2
 2 |   3
 4 |   4
insert into test values
(3,3), (2,2)
on duplicate key update pos = values(pos);
Duplicate entry '3' for key 'test.pos'
select * from test;
id | pos
-: | --:
 1 |   1
 3 |   2
 2 |   3
 4 |   4
insert into test values
(2,0), (3,3), (2,2)
on duplicate key update pos = values(pos);

select * from test;
id | pos
-: | --:
 1 |   1
 2 |   2
 3 |   3
 4 |   4

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...