2009-01-22 5 views
7

Voici l'état actuel de ma table:Définir ligne égale à l'autre ligne dans 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) 

Je veux ligne 1 pour contenir les valeurs de la ligne 2. En fait, je veux faire:

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

Est-ce quelque chose comme cela possible?

+1

Dans un commentaire/post ci-dessous, vous dites que vous voulez faire cela "avec beaucoup de tables différentes". Si vous créez régulièrement des lignes identiques dans votre base de données, cela peut indiquer que vous devez repenser la manière dont vous stockez vos données. –

Répondre

0

Vous pouvez le faire avec deux instructions.

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 

Alternativement, vous pouvez rejoindre la table sur elle-même et mettre à jour explicitement les valeurs. = derivedtable.field-à-dire mis page.field

+1

Supprimer puis recréer une ligne plutôt que de simplement la mettre à jour n'est pas vraiment une bonne idée. – Kip

8

insérer dans la page (id, titre, corps, page, visible) Sélectionnez 2, le titre, le corps, la page, visible

peut être fait (en MySQL seulement) sans supprimer à l'aide d'un 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); 

peut cependant aussi fait (peut-être mieux) d'une manière conforme à la norme ANSI avec un autojointure:

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

Il devrait être possible d'écrire une procédure stockée qui regarderait les métadonnées de la table en question, et de construire le SQL nécessaire pour mettre à jour une ligne d'une autre sans devoir coder en dur. (Obtenez l'ensemble de toutes les colonnes, boucle sur elle, etc.) Mais cela semble beaucoup de travail.

Vous pouvez également faire la même chose avec le code de l'application (PHP, Perl, C#, ou autre), si vous ne pouvez pas le faire avec sprocs.

Questions connexes