Обмен значениями столбца в MySQL - PullRequest
115 голосов
/ 01 сентября 2008

У меня есть таблица MySQL с координатами, имена столбцов X и Y. Теперь я хочу поменять значения столбцов в этой таблице, чтобы X стал Y, а Y стал X. Наиболее очевидным решением было бы переименование столбцов , но я не хочу вносить изменения в структуру, поскольку у меня не обязательно есть разрешения для этого.

Возможно ли это как-то сделать с ОБНОВЛЕНИЕМ ? ОБНОВЛЕНИЕ таблицы SET X = Y, Y = X , очевидно, не будет делать то, что я хочу.


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

Ответы [ 17 ]

1 голос
/ 28 августа 2009

Вы можете изменить имена столбцов, но это скорее хак. Но будьте осторожны с любыми индексами, которые могут быть в этих столбцах

1 голос
/ 22 декабря 2008

Я не пробовал, но

UPDATE tbl SET @temp=X, X=Y, Y=@temp

Могу это сделать.

Mark

0 голосов
/ 03 января 2019

Имя таблицы - клиент. поля a и b, меняйте значение на b;.

ОБНОВЛЕНИЕ ПОЛЬЗОВАТЕЛЯ a = (@ temp: = a), a = b, b = @ temp

Я проверил, что это работает нормально.

0 голосов
/ 06 сентября 2018

Этот пример меняет местами start_date и end_date для записей, в которых даты встречаются неверно (при выполнении ETL в основную перезапись я нашел start даты позже их end даты. Да, плохие программисты!).

На месте я использую MEDIUMINT для повышения производительности (например, юлианские дни, но с корнем 0 в 1900-01-01), поэтому я был в порядке, выполняя условие ГДЕ mdu.start_date> mdu. end_date .

PK были на всех 3 столбцах индивидуально (по причинам эксплуатации / индексации).

UPDATE monitor_date mdu
INNER JOIN monitor_date mdc
    ON mdu.register_id = mdc.register_id
    AND mdu.start_date = mdc.start_date
    AND mdu.end_date = mdc.end_date
SET mdu.start_date = mdu.end_date, mdu.end_date = mdc.start_date
WHERE mdu.start_date > mdu.end_date;
0 голосов
/ 24 июня 2016

Мне нужно было просто переместить значение из одного столбца в другой (например, архивирование) и сбросить значение исходного столбца.
Ниже (ссылка № 3 из принятого ответа выше) работал для меня.

Update MyTable set X= (@temp:= X), X = 0, Y = @temp WHERE ID= 999;
0 голосов
/ 09 февраля 2015
CREATE TABLE Names
(
F_NAME VARCHAR(22),
L_NAME VARCHAR(22)
);

INSERT INTO Names VALUES('Ashutosh', 'Singh'),('Anshuman','Singh'),('Manu', 'Singh');

UPDATE Names N1 , Names N2 SET N1.F_NAME = N2.L_NAME , N1.L_NAME = N2.F_NAME 
WHERE N1.F_NAME = N2.F_NAME;

SELECT * FROM Names;
0 голосов
/ 10 июня 2014

Обмен значений столбцов с помощью одного запроса

ОБНОВЛЕНИЕ my_table SET a = @ tmp: = a, a = b, b = @ tmp;

ура! ... * * 1005

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