2015-07-08 4 views
0

У меня на столе были смешаны даты, столбцы startDate и endDate необходимо переключить. Я использую SQL Server, и это можно сделать с помощью курсора в SQL Server, но в MySQL вы можете использовать только курсор внутри SP, который я не хочуMySQL: обновить несколько значений на основе informatin из оператора select

Следующий оператор возвращает все записи, которые необходимо обновить

select * from calendarTable where endDate < startDate; 

Я попытался следующий код, но это первые устанавливает STARTDATE к значению ENDDATE то ENDDATE к новому значению STARTDATE так это заканчивается, поскольку обе даты являются одинаковыми и не переключился

update calendarTable 
set startDate = endDate, 
    endDate = startDate 
where startDate > endDate; 

Является ли это Это способ сделать это в MySQL похожим на курсор в SQL Server или как вы это сделаете в MySQL?

ответ

0

MySQL по большей части оценивает присвоения в порядке слева направо. Если вы хотите поменять значения в двух областях, вы должны использовать переменный временный удерживать одно из значений при перемещении вещи вокруг:

UPDATE @temp := startDate, startDate = endDate, endDate = @temp 

назначений в заявлении вступает в силу немедленно, так что если вы «повторно» измененное поле позже в запросе, вы получите обновленное значение, не оригинал:

mysql> select * from foo; 
+------+ 
| x | 
+------+ 
| 1 | 
| 10 | 
+------+ 
2 rows in set (0.00 sec) 

mysql> update foo set x=x+1, x=x+50; 
Query OK, 2 rows affected (0.00 sec) 
Rows matched: 2 Changed: 2 Warnings: 0 

mysql> select * from foo; 
+------+ 
| x | 
+------+ 
| 52 | 
| 61 | 
+------+ 
2 rows in set (0.00 sec) 

, если MySQL используется «оригинал» значения для правой стороны, то финальный стол был бы 51 и 60, поскольку значения, созданные компонентом +1, были бы уничтожены более поздним +10.

Вместо этого вы получаете «живое» значение при каждом использовании запроса, поэтому значение поля полностью зависит от того, что вы делаете с ним внутри запроса, и где вы используете его в запросе.

+0

но как бы вы сделали это для mutliple обновлений ... например, если мой оператор выбора 'выбрать * из calendarTable где ENDDATE

+0

точно так же, как и для одной строки. mysql не работает «через» строки. строка - это немного юниверса сама по себе, и обновления работают только по отдельным строкам за один раз (если вы не начнете смешивать себя и другие более сложные вещи). Таким образом, даже если ваша таблица имеет 5000 записей, вы можете сделать 5000 отдельных «суб-обновлений» с помощью одного запроса «update ...». –

+0

, то как вы устанавливаете временные значения в инструкции обновления, чтобы вы могли просто переключить два поля и не обновлять два поля с заданным значением? –

0

я сумел сделать это, используя присоединение на выбор, как показано ниже

UPDATE calendarTable as cal, 
(
    select id,startDate,endDate from calendarTable where endDate < startDate 
) as temp 
SET cal.startDate = temp.endDate, cal.endDate = temp.startDate WHERE cal.ID = temp.ID;