2009-01-22 11 views
7

Aquí es el estado actual de mi mesa:establecer fila igual a otra fila en 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) 

Quiero fila 1 para contener los valores de la fila 2. Básicamente, quiero hacer:

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

es algo como esto posible?

+1

En un comentario/publicación a continuación dices que querrás hacer esto "con muchas tablas diferentes". Si regularmente hace filas idénticas en su base de datos, podría ser una señal de que necesita volver a pensar cómo está almacenando sus datos. –

Respuesta

0

Puede hacerlo con dos declaraciones.

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 

Como alternativa, puede volver a unirse a la tabla y actualizar los valores de forma explícita. es decir, establece derivedtable.field = page.field

+1

Eliminar y luego volver a crear una fila en lugar de simplemente actualizarlo no es realmente una buena idea. – Kip

8

inserción en la página (id, título, cuerpo, página, visible) Seleccionar 2, título, cuerpo, página, visible

Se puede realizar (en MySQL solamente) sin borrar con un interruptor 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); 

sin embargo también se puede hacer (quizás mejor) de una manera compatible con ANSI con una autocombinación:

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

Debería ser posible escribir un procedimiento almacenado que vería los metadatos de la tabla en cuestión, y construir el SQL necesario para actualizar una fila de otra sin tener que codificarla. (Obtenga el conjunto de todas las columnas, bucle sobre él, etc.) Pero eso parece mucho trabajo.

También podría hacer lo mismo en el código de la aplicación (PHP, Perl, C# o lo que sea), si no puede lograrlo con sprocs.