2013-10-19 23 views
7

Mam następujące struktury tabeli (za pomocą SHOW CREATE komendę dopiero teraz):Duplikat wejście na klucz „PRIMARY” dla każdego zapytania INSERT próbuję w konkretnej tabeli

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; 

Teraz wystarczy pobrać kilka niedawne wartości (zmieniłem adresy IP dla demonstracji):

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 | 
+--------+----------------+--------+---------------------+ 

po tym, postaram się wykonać prosty INSERT oświadczenie:

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`) 

gdzie wartość 10.3.100.244 jeszcze nie istnieje w tabeli. Wynika to z:

ERROR 1062 (23000): Duplicate entry '253691' for key 'PRIMARY' 

Wybór LAST_INSERT_ID daje:

mysql> SELECT LAST_INSERT_ID(); 
+------------------+ 
| LAST_INSERT_ID() | 
+------------------+ 
|    0 | 
+------------------+ 

Jeśli to nie było już dziwne zachowanie; Postaram się wstawić już istniejący wpis IP:

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' 

ja teraz oficjalnie stumped na ten problem z MySQL. Wszystkie inne zapytania działają poprawnie we wszystkich innych uruchomionych procesach. Błąd występuje tylko wtedy, gdy próbuję uzyskać INSERT do tabeli ipstats. Próbowałem nawet:

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' 

Co może być problemem? Jak mogę to rozwiązać? Błąd pojawił się od dzisiejszego popołudnia i nigdy wcześniej nie spotkałem się z takim problemem.

P.S.: Błąd występuje we wszystkich kontach użytkowników w mojej instalacji MySQL. Istnieje 4 użytkowników (w tym root), którzy mają dostęp do bazy danych. Żadne z nich nie jest w stanie wykonać kwerendy INSERT.

+1

+1 za podane informacje. –

+0

Co to ma osiągnąć? 'id = LAST_INSERT_ID (id)' –

+0

Nadal myślę, że powinieneś usunąć identyfikator = LAST_INSERT_ID (id), tak jak ja w mojej odpowiedzi, co usunąłem .. –

Odpowiedz

1

Wymuszone wstawienie nowego wiersza (z id innym niż 253691) najwyraźniej rozwiązało ten problem na razie. Nadal nie jestem pewien, dlaczego wystąpił błąd.

Komenda Kiedyś było:

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

a system działa normalnie ponownie (dla wszystkich 4 użytkowników, na każdym połączeniu). Pozostawię pytanie jako wciąż bez odpowiedzi, ponieważ wciąż nie wiem, co spowodowało problem. Domyślam się, że jest to możliwy błąd MySQL.

+0

Powinieneś [sprawdzić "] (http://dev.mysql.com/doc/refman/5.5/ pl/myisamchk.html) tabela. Być może tabela lub indeks został uszkodzony. –