Значения первичного ключа свопа sql

Можно ли менять значения первичных ключей между двумя наборами данных? Если да, то как это сделать?

Ответы

Ответ 1

Пусть для простоты предположим, что у вас есть две записи

id   name
---------
1    john

id   name
---------
2    jim

как из таблицы t (но они могут поступать из разных таблиц)

Вы могли бы сделать

UPDATE t, t as t2
SET t.id = t2.id, t2.id = t.id
WHERE t.id = 1 AND t2.id = 2

Примечание: Обновление первичных ключей имеет другие побочные эффекты, и, возможно, предпочтительным подходом было бы оставить первичные ключи такими, какими они есть, и поменять значения всех остальных столбцов.

Протест: Причина, по которой работает t.id = t2.id, t2.id = t.id, заключается в том, что в SQL обновление происходит на уровне транзакции. t.id не является переменной и = не является назначением. Вы могли бы интерпретировать его как "установить t.id на значение t2.id перед эффектом запроса, установить t2.id в значение t.id, имевшееся до эффекта запроса". Тем не менее, некоторые базы данных могут не выполнять надлежащую изоляцию, например, question (однако, работа над запросом, который, вероятно, считается обновлением нескольких таблиц, ведет себя в соответствии с стандарт в mysql).

Ответ 2

Я предпочитаю следующий подход (Justin Cave писал что-то подобное):

update MY_TABLE t1
set t1.MY_KEY = (case when t1.MY_KEY = 100 then 101 else 100 end)
where t1.MYKEY in (100, 101)

Ответ 3

Подобно решению @Bart, но я использовал несколько иной способ:

update t
set t.id=(select decode(t.id, 100, 101, 101, 100) from dual)
where t.id in (100, 101);

Это то же самое, но я знаю decode лучше, чем case.

Кроме того, чтобы сделать решение @Bart для меня, мне пришлось добавить when:

update t
set t.id = (case when t.id = 100 then 101 else 101 end)
where t.id in (100, 101);