2009-01-22 4 views
7

Hier ist der aktuelle Stand meiner Tabelle:Zeile gleich zu anderer Zeile in MySQL setzen?

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) 

Ich möchte Zeile 1 die Werte der Reihe 2. Grundsätzlich enthalten, möchte ich tun: wie dieses möglich

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

Ist etwas?

+1

In einem Kommentar/Post unten sagen Sie, dass Sie dies "mit vielen verschiedenen Tabellen" tun möchten. Wenn Sie regelmäßig identische Zeilen in Ihrer Datenbank erstellen, könnte dies ein Zeichen dafür sein, dass Sie die Art und Weise, wie Sie Ihre Daten speichern, überdenken müssen. –

Antwort

0

Sie könnten es mit zwei Aussagen tun.

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 

Alternativ können Sie die Tabelle auf sich selbst zurückführen und die Werte explizit aktualisieren. dh gesetzt derivedtable.field = page.field

+1

Löschen, dann eine Zeile neu erstellen, anstatt nur zu aktualisieren, ist nicht wirklich eine gute Idee .. – Kip

8

Einsatz in Seite (id, Titel, Körper, Seite sichtbar) 2 Wählen Sie, Titel, Körper, Seite sichtbar

getan werden kann (in MySQL nur) ohne die DELETE durch ein 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); 

können aber auch (vielleicht besser gemacht) in einer ANSI-kompatibelen Art und Weise mit einem selbst-Join:

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

Es sollte möglich sein, eine gespeicherte Prozedur zu schreiben, die sich die Metadaten für die fragliche Tabelle ansehen und das notwendige SQL erstellen würde, um eine Zeile von einer anderen zu aktualisieren, ohne sie hart codieren zu müssen. (Holen Sie sich die Menge aller Spalten, durchlaufen Sie sie, usw.) Aber das scheint eine Menge Arbeit zu sein.

Sie könnten auch dasselbe in Anwendungscode (PHP, Perl, C# oder was auch immer) tun, wenn Sie es nicht mit Sprocs erreichen können.