Ho una tabella denominata tbl_jobs
che memorizza i metadati di alcuni processi in background in esecuzione nell'applicazione. Lo schema è simile:Duplica voce per chiave "PRIMARY" in mysql
CREATE TABLE `tbl_jobs` (
`type` varchar(30) NOT NULL DEFAULT '',
`last_run_on` datetime NOT NULL,
`records_updated` text,
PRIMARY KEY (`type`,`last_run_on`),
UNIQUE KEY `index2` (`type`,`last_run_on`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$
Ogni volta che un lavoro viene eseguito lo rende una voce nella tabella con la type
che è un identificatore univoco per diversi lavori, run time
e la records updated
in quel periodo.
Esistono due diversi lavori che vengono eseguiti contemporaneamente con i tipi: MAILER_UNLOCKED_REWARDS
e MAILER_ALMOST_UNLOCKED
.
Quando questi lavori cercano di inserire le voci con lo stesso timestamp, solo uno di essi viene inserito e l'altro genera un errore Duplicato per la chiave.
Per esempio i due lavori eseguito il seguente:
INSERT INTO tbl_jobs
(type,
last_run_on,
records_updated)
VALUES ('MAILER_ALMOST_UNLOCKED',
'2012-08-22 19:10:00',
'f8a35230fb214989ac75bf11c085aa28:b591426df4f340ecbce5a63c2a5a0174')
che correva con successo ma quando il secondo lavoro ha eseguito il comando di inserimento
INSERT INTO tbl_jobs
(type,
last_run_on,
records_updated)
VALUES ('MAILER_UNLOCKED_REWARDS',
'2012-08-22 19:10:00',
'8a003e8934c07f040134c30959c40009:59bcc21b33a0466e8e5dc50443beb945')
Si gettò l'errore
Duplicate entry 'M-2012-08-22 19:10:00' for key 'PRIMARY'
La chiave primaria è la combinazione di type
e last_run_on
colonne.
Se elimino la voce per il primo lavoro, l'inserimento ha esito positivo, cioè è necessario che timestamp
sia univoco.
Tuttavia il conflitto per lo stesso timestamp
si verifica solo tra questi due processi. Esistono altri lavori che vengono inseriti per lo stesso timestamp
.
Qualche idea su quale potrebbe essere il problema?
è possibile mostrare lo show create table tbl_jobs' – jcho360
Solo un commento ', mi consiglia di utilizzare una chiave surrogata. Potresti avere più di una voce che si verifica ogni secondo. – Kermit
Poiché una chiave primaria è necessariamente univoca, è necessario rimuovere la riga 'UNIQUE KEY' del proprio script. – sp00m