Originariamente inviato da saggio68
c'è ID che è primary key (ho letto qui che va bene), ma non fa l'update.
ahem... devi mettere la chiave dentro la insert, sennò come fa a "scattare" il duplicate keys?
Se per ID intendi un campo autoincrementante, OVVIAMENTE non funzionerà mai.

Perchè ad ogni insert ti metterà un ID nuovo (aggiunto) e niente collisione

INSERT INTO libri (autore,titolo, casa) VALUES ('calvino','il sentiero dei nidi di ragno','einaudi')
ON DUPLICATE KEY UPDATE casa='rizzoli'

Se autore e titolo non cambiano mai (cambia solo la casa), puoi fare qualcosa tipo aggiungere un campo chiave intera (... chiave primaria ovviamente...) che userai così

chiave=crc32(concat(autore,titolo))

e ci metti un bel
INSERT INTO libri (chiave, autore,titolo,casa) VALUES (crc32(concat('calvino','il sentiero dei nidi di ragno')),'calvino','il sentiero dei nidi di ragno','einaudi')
ON DUPLICATE KEY UPDATE casa='rizzoli'

questo dovrebbe funzionare (se non hai un numero gigantesco di libri, milioni)