установить строку, равную другой строке в MySQL? - PullRequest
7 голосов
/ 22 января 2009

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

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;

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

Ответы [ 3 ]

8 голосов
/ 22 января 2009

вставить на страницу (идентификатор, заголовок, тело, страница, видимый) Выберите 2, заголовок, тело, страница, видимый

Может быть сделано (только в MySQL) без УДАЛЕНИЯ, используя 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
0 голосов
/ 22 января 2009

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

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

0 голосов
/ 22 января 2009

Вы можете сделать это с двумя утверждениями.

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

Кроме того, вы можете присоединить таблицу обратно к себе и явно обновить значения. то есть, набор производных.поле = страницы.поля

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