Sto tentando di inserire una nuova riga, ma se la chiave esiste già, voglio aggiornare SOLO la riga se un altro valore nella tabella è diverso. È possibile ciò in una query/istruzione mysql?subordinato all'aggiornamento della chiave duplicata
Il mio tavolo è composto dalle seguenti colonne: cappello, guanti, nome, last_update
cappello + guanti compongono l'indice univoco (dicono i valori di "cappello" e "guanti" sono i colori)
Supponiamo che questo sia già nella tabella:
1. hat=blue mittens=green name=george last_update=tuesday 2. hat=red mittens=green name=bill last_update=monday
Su una nuova chiave, voglio inserire come al solito. Sulla chiave duplicata, voglio fare un aggiornamento SOLO SE il nome cambia, altrimenti ignoro. La ragione di ciò è che voglio conservare il valore last_update (timestamp).
hat=yellow mittens=purple name=jimmy -- insert new row hat=blue mittens=green name=george -- ignore hat=blue mittens=green name=betty -- update row
Questo è possibile senza l'utilizzo di dichiarazioni separate per guardare prima la riga esistente, confrontare i valori e quindi rilasciare un aggiornamento, se necessario? Se sì, quale sarebbe la sintassi?
Grazie per le vostre risposte. Ho provato tutti loro. Infatti, utilizzando solo una semplice dichiarazione UPDATE come
update tbl set name='george' where hat='blue' and mittens='green'
risultati in alcuna riga in fase di aggiornamento. Ma, utilizzando
INSERT INTO tbl (hat,mittens,name) VALUES ('blue','green','george') ON DUPLICATE KEY UPDATE name='george';
o
INSERT INTO tbl (hat, mittens, name) VALUES ('blue','green','george') ON DUPLICATE KEY UPDATE name=CASE WHEN name <> VALUES(name) THEN VALUES(name) ELSE name END;
traduce in qualche modo nella fila essendo aggiornato (e il timestamp modificato).
FWIW, questo è il tavolo che sto usando:
CREATE TABLE `tbl` (
`hat` varchar(11) default NULL,
`mittens` varchar(11) default NULL,
`name` varchar(11) default NULL,
`stamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
UNIQUE KEY `clothes` (`hat`,`mittens`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
MySQL è la versione 4.1.22 (forse questo importa?) Ancora una volta, il mio apprezzamento per tutte le risposte.
direi che è la vostra versione di MySQL che è il problema qui. Sembra che abbiano corretto un bug (http://bugs.mysql.com/bug.php?id=28904) con INSERT ... ON DUPLICATE KEY UPDATE nel ramo 5.0, dopo il supporto attivo per il ramo 4.1 terminato (Dec 31, 2006). Ho ricreato la tua tabella e il test case sulla mia macchina e ha funzionato come previsto, e sto utilizzando MySQL Server 5.0.67. Se non riesci ad aggiornare l'installazione di MySQL, potresti rimanere bloccato senza una soluzione "singola query" al tuo problema. – zombat
CONFERMATO. Entrambe le soluzioni funzionano su 5.0.45 (sfortunatamente, è solo un server di sviluppo). Grazie ancora! – javalina
Hai provato la seconda delle due domande che ho suggerito?Quello che controlla manualmente cosa è successo alla colonna timbro (last_update)? Credo che uno dovrebbe funzionare anche se quel bug esiste in quanto decide esplicitamente se aggiornare la colonna o meno con un'altra dichiarazione del caso. – Dipin