2013-10-19 18 views
7

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

+1 per le informazioni fornite. –

+0

Cosa dovrebbe raggiungere? 'id = LAST_INSERT_ID (id)' –

+0

Ancora penso che dovresti rimuovere l'id = LAST_INSERT_ID (id) come se avessi nella mia risposta cosa ho rimosso .. –

risposta

1

Un inserimento forzato di una nuova riga (con id diverso da 253691) sembra aver risolto questo problema per ora. Non sono ancora sicuro del motivo per cui si è verificato l'errore.

Il comando ho usato era:

INSERT INTO `ipstats` (id, ip, online, last_used) 
VALUES (253699, '10.204.102.38', 'n', NOW()); 

e il sistema funzionava normalmente nuovamente (per tutti gli utenti 4, su ogni connessione). Lascerò la domanda come ancora senza risposta poiché non so ancora cosa ha causato il problema. La mia ipotesi migliore sarebbe che sia un possibile bug di MySQL.

+0

Dovresti ['check'] (http://dev.mysql.com/doc/refman/5.5/ en/myisamchk.html) il tavolo. Forse la tabella o un indice era corrotto. –

Problemi correlati