2009-01-22 12 views
7

Oto aktualny stan mojego stołu:ustawić wiersz równy inny wiersz w 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) 

chcę wiersz 1 zawiera wartości rzędu 2. Zasadniczo chcę zrobić:

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

Czy coś takiego jest możliwe?

+1

W komentarzu/postie poniżej powiesz, że będziesz chciał to zrobić "z wieloma różnymi tabelami". Jeśli regularnie tworzysz identyczne wiersze w bazie danych, może to oznaczać, że musisz przemyśleć sposób przechowywania danych. –

Odpowiedz

0

Można to zrobić za pomocą dwóch zdań.

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 

Alternatywnie można dołączyć do tabeli z powrotem na siebie i jawnie zaktualizować wartości. czyli ustawić derivedtable.field = page.field

+1

Usuwanie, ponowne tworzenie wiersza, a nie tylko jego aktualizacja, nie jest dobrym pomysłem. – Kip

8

wkładka do strony (identyfikator, tytuł, treść strony, widoczny) Wybierz 2, tytuł, treść strony, widoczny

Może być zrobione (w MySQL tylko) bez usunąć, stosując ON duplikat 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); 

jednak można również zrobić (może lepiej) w sposób zgodny z ANSI-self-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

Powinna istnieć możliwość napisania procedury składowanej, która zajmie się metadanymi dla danej tabeli i skonstruowania niezbędnego kodu SQL, aby zaktualizować jeden wiersz bez konieczności jego kodowania. (Zdobądź zestaw wszystkich kolumn, zapętlić go, itp.) Ale to wygląda na strasznie dużo pracy.

Można również zrobić to samo w kodzie aplikacji (PHP, Perl, C# lub cokolwiek), jeśli nie można tego zrobić za pomocą sprocs.

Powiązane problemy