2012-06-29 18 views
7

C'è un modo semplice per aggiornare tutti i valori dopo una chiave duplicata? Ad esempio:Mysql: ON DUPLICATE KEY UPDATE TUTTI I VALORI?

INSERT INTO published_books 
      SELECT * FROM books 
      WHERE book_id = book_id 
      ON DUPLICATE KEY UPDATE ?everything? 

Il tavolo ha circa 50 colonne e l'aggiornamento di ciascuna sarebbe doloroso. Qualche idea?

+0

doloroso per chi? –

+10

per il programmatore ... e per gli occhi degli altri codificatori :) – luqita

risposta

-3
INSERT INTO published_books(col1, col2) 
VALUES (’xxx’, ‘yyy’) ON DUPLICATE KEY UPDATE col1 = VALUES(col1) 
+2

come faresti la stessa cosa con 50 colonne? col1, col2 ... col50? – luqita

4

È possibile utilizzare REPLACE INTO per questo scopo:

REPLACE INTO published_books SELECT * from books; 
+2

Si prega di essere consapevoli quando si usa "REPLACE INTO' che effettivamente cancella e ricrea una riga con solo le informazioni nell'inserto. Non aggiorna la riga come "ON DUPLICATE KEY UPDATE". Per maggiori informazioni vedi qui: http://code.openark.org/blog/mysql/replace-into-think-twice – George

0

Se è possibile generare la query, si potrebbe usare qualcosa di simile (PHP):

$fields = array(
    'field_1', 
    'field_2', 
    'field_3' 
); 
$query = ' 
    INSERT INTO table (
    ' . implode(', ', $fields) . ' 
    ) SELECT 
     -- ... 
    ON DUPLICATE KEY UPDATE '; 
foreach ($fields as $i => $field) { 
    $query .= ($i > 0 ? ', ' : '') . $field . '=VALUES(' . $field . ')'; 
} 
Problemi correlati