Установить строку равной другой строке в MySQL?

Вот текущее состояние моей таблицы:

mysql> select * from page;
+----+----------+----------------+------+---------+
| id | title    | body           | page | visible |
+----+----------+----------------+------+---------+
|  1 | my title | my body        | NULL |       1 | 
|  2 | my title | my body edited |    1 |       0 | 
+----+----------+----------------+------+---------+
2 rows in set (0.00 sec)

Я хочу, чтобы строка 1 содержала значения строки 2. В основном я хочу сделать:

UPDATE page SET page.* = (SELECT * FROM page WHERE id = 2) WHERE id = 1;

Возможно ли что-то подобное?

В комментарии / сообщении ниже вы говорите, что хотите сделать это «с множеством разных таблиц». Если вы регулярно создаете одинаковые строки в своей базе данных, это может быть признаком того, что вам нужно переосмыслить, как вы храните свои данные.

Sean McSomething 22.01.2009 21:47
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
7
1
3 967
3

Ответы 3

Вы можете сделать это с помощью двух утверждений.

Delete from page where id = 2
insert into page (id, title, body, page, visible) Select 2, title, body, page, visible
from page where id = 1

В качестве альтернативы вы можете снова присоединиться к таблице и явно обновить значения. т.е. установить производную таблицу.field = page.field

Удаление и воссоздание строки вместо ее простого обновления - не очень хорошая идея.

Kip 22.01.2009 18:31

insert into page (id, title, body, page, visible) Select 2, title, body, page, visible

Может быть выполнено (только в MySQL) без DELETE с помощью ON DUPLICATE KEY UPDATE:

INSERT
    INTO page (id, title, body, page, visible)
    SELECT 1, title, body, page, visible FROM page WHERE id=2
    ON DUPLICATE KEY UPDATE
        title= VALUES(title), page= VALUES(page), visible= VALUES(visible);

Однако это также можно сделать (возможно, лучше) ANSI-совместимым способом с самосоединением:

UPDATE page AS page1 JOIN page AS page2 ON page1.id=1 AND page2.id=2
SET page1.title=page2.title, page1.body= page2.body, page1.page= page2.page, page1.visible=page2.visible

Должна быть возможность написать хранимую процедуру, которая будет смотреть на метаданные для рассматриваемой таблицы и создавать необходимый SQL для обновления одной строки из другой без необходимости ее жесткого кодирования. (Получите набор всех столбцов, переберите его и т. д.) Но это кажется ужасно большим объемом работы.

Вы также можете сделать то же самое в коде приложения (PHP, Perl, C# или что-то еще), если вы не можете сделать это с помощью sprocs.

Другие вопросы по теме