Ho la seguente struttura della tabella (usando SHOW CREATE
comando solo ora):voce duplicata per la chiave 'primaria' per ogni query INSERT sto cercando in una particolare tabella
CREATE TABLE `ipstats` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`ip` VARCHAR(15) NOT NULL,
`online` ENUM('n','y') NOT NULL DEFAULT 'y',
`last_used` DATETIME NOT NULL DEFAULT '1981-09-30 00:00:00',
PRIMARY KEY (`id`),
UNIQUE INDEX `ip` (`ip`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM
AUTO_INCREMENT=253691;
Ora, ho semplicemente recuperare un paio di recente valori (ho cambiato gli indirizzi IP per la dimostrazione):
mysql> SELECT * FROM ipstats ORDER BY id DESC LIMIT 10;
+--------+----------------+--------+---------------------+
| id | ip | online | last_used |
+--------+----------------+--------+---------------------+
| 253690 | 10.204.102.38 | n | 2013-10-19 14:14:33 |
| 253689 | 10.188.124.196 | n | 2013-10-19 10:46:25 |
| 253688 | 10.166.124.194 | n | 2013-10-19 16:49:40 |
| 253687 | 10.250.137.166 | n | 2013-10-19 13:51:56 |
| 253686 | 10.221.102.39 | n | 2013-10-19 14:13:03 |
| 253685 | 10.129.102.57 | n | 2013-10-19 18:45:20 |
| 253684 | 10.214.102.39 | n | 2013-10-19 03:43:55 |
| 253683 | 10.31.142.41 | n | 2013-10-19 17:27:08 |
| 253682 | 10.41.142.154 | n | 2013-10-19 00:52:11 |
| 253681 | 10.41.124.84 | n | 2013-10-19 10:37:12 |
+--------+----------------+--------+---------------------+
Dopo questo, cercherò di eseguire un semplice INSERT
dichiarazione:
INSERT INTO `ipstats` (`ip`, `last_used`)
VALUES ('10.3.100.244', NOW())
ON DUPLICATE KEY UPDATE
`online` = 'y',
`last_used` = NOW(),
`id` = LAST_INSERT_ID(`id`)
dove il valore 10.3.100.244
non esiste già nella tabella. Essa si traduce in:
ERROR 1062 (23000): Duplicate entry '253691' for key 'PRIMARY'
Selezione del LAST_INSERT_ID
dà:
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 0 |
+------------------+
Se questo non era un comportamento già strano; Cercherò di inserire una voce IP già esistente:
mysql> INSERT INTO `ipstats` (`ip`, `last_used`) VALUES ('10.204.102.38', NOW()) ON DUPLICATE KEY UPDATE `online` = 'y', `last_used` = NOW(), `id` = LAST_INSERT_ID(`id`);
ERROR 1062 (23000): Duplicate entry '253691' for key 'PRIMARY'
sto ora ufficialmente perplesso a questo comportamento da MySQL. Tutte le altre query funzionano correttamente in tutti gli altri processi in esecuzione. L'errore si verifica solo quando provo a INSERT
nella tabella ipstats
. Ho anche provato il seguente:
mysql> UPDATE ipstats
SET `online` = 'n',
`last_used` = NOW(),
`id` = LAST_INSERT_ID(`id`)
WHERE ip = '10.204.102.38';
Affected rows: 1 Found rows: 0 Warnings: 0 Duration for 1 query: 0.000 sec.
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 253690 |
+------------------+
Affected rows: 0 Found rows: 1 Warnings: 0 Duration for 1 query: 0.000 sec.
mysql> INSERT INTO `ipstats` (`ip`, `last_used`)
VALUES ('10.204.102.38', NOW())
ON DUPLICATE KEY UPDATE
`online` = 'y',
`last_used` = NOW(),
`id` = LAST_INSERT_ID(`id`);
Error 1062 (23000): Duplicate entry '253691' for key 'PRIMARY'
Quale potrebbe essere il problema? Come posso risolvere questo? L'errore si è verificato da oggi pomeriggio e non ho mai affrontato un problema del genere prima.
P.S.: l'errore si verifica con tutti gli account utente nella mia installazione MySQL. Ci sono 4 utenti (incluso root) che possono accedere al database. Nessuno di questi è in grado di eseguire la query INSERT
.
+1 per le informazioni fornite. –
Cosa dovrebbe raggiungere? 'id = LAST_INSERT_ID (id)' –
Ancora penso che dovresti rimuovere l'id = LAST_INSERT_ID (id) come se avessi nella mia risposta cosa ho rimosso .. –