2013-09-05 2 views
0

У меня есть таблица со столбцами NAME и ID. Например,SQL: обменять ВЗАИМНО ЭКСКЛЮЗИВНЫЕ столбцы?

[ID] [NAME] 
1 John Lee 
2 Ben Smith 

Я хочу переключить ИМЯ двух пользователей (их идентификаторы останутся прежними). Тем не менее, база данных, с которой я работаю, не позволяет двум пользователям иметь одно и то же NAME (даже NULL), поэтому я не могу установить «Ben Smith» на «John Lee», если у пользователя нет NAME «John Lee».

Я полагаю, что я мог бы просто сделать это с помощью PHP и сохранить оба их имени в переменной, а затем сделать запрос, чтобы изменить два ИМЯ на что-то случайное, а затем назначить замененные ИМЯ пользователям.

Но есть ли более элегантный способ?

+0

Вы пробовали использовать блок транзакции? – caskey

+0

Нет. Что это? –

+1

У реализации SQL часто есть способ создать «транзакцию», которая содержит несколько сложных шагов, которые все вступают в силу в конце транзакции. Многое зависит от поставщика вашего SQL-сервера и того, что его синтаксис позволяет - например, подавлять проверки целостности до тех пор, пока не будут сделаны оба изменения. – caskey

ответ

1

Используйте случай выражение

Update Table set 
    name = case name 
     when 'John Lee' then 'Ben Smith' 
     when 'Ben Smith' then 'John Lee' End 
From table 
Where name in ('John Lee', 'Ben Smith') 
0

У меня есть это решение. Он заменяет имена в одной транзакции.

DECLARE @names AS TABLE (id INTEGER, name VARCHAR(50), UNIQUE(name)) 

INSERT INTO @names (id, name) VALUES (1, 'John') 
INSERT INTO @names (id, name) VALUES (2, 'Ben') 


UPDATE N SET name = N2.name 
FROM @names N 
INNER JOIN (VALUES(1,2),(2,1)) S (old, new) ON N.id = S.old 
INNER JOIN @names N2 ON S.new = N2.id 

SELECT * FROM @names 
Смежные вопросы