Вот текущее состояние моей таблицы:
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;
Возможно ли что-то подобное?






Вы можете сделать это с помощью двух утверждений.
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
Удаление и воссоздание строки вместо ее простого обновления - не очень хорошая идея.
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.
В комментарии / сообщении ниже вы говорите, что хотите сделать это «с множеством разных таблиц». Если вы регулярно создаете одинаковые строки в своей базе данных, это может быть признаком того, что вам нужно переосмыслить, как вы храните свои данные.