2013-10-19 13 views
7

Ich habe die folgende Tabellenstruktur (SHOW CREATE Befehl gerade verwendet wird):doppelte Eintrag für Schlüssel ‚primären‘ für jede INSERT-Abfrage ich in einer bestimmten Tabelle versuchen

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; 

Nun hole ich einfach ein paar letzten Werte (ich habe die IP-Adressen für die Demonstration geändert):

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

Danach, ich werde versuchen, eine einfache INSERT Anweisung auszuführen:

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

wo der Wert 10.3.100.244 nicht bereits in der Tabelle vorhanden ist. Es ergibt sich:

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

Auswahl der LAST_INSERT_ID gibt:

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

Wenn das nicht schon seltsame Verhalten war; Ich werde versuchen, einen bereits vorhandenen IP-Eintrag einzufügen:

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' 

Ich bin jetzt offiziell bei diesem Verhalten von MySQL ratlos. Alle anderen Abfragen funktionieren in allen anderen Prozessen, die ausgeführt werden. Der Fehler tritt nur auf, wenn ich versuche, INSERT zu der ipstats Tabelle. Ich habe sogar folgendes versucht:

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' 

Was könnte das Problem sein? Wie kann ich das beheben? Der Fehler ist seit heute Nachmittag aufgetreten und ich hatte noch nie zuvor ein solches Problem.

P.S.: Der Fehler tritt bei allen Benutzerkonten in meiner MySQL-Installation auf. Es gibt 4 Benutzer (einschließlich root), die auf die Datenbank zugreifen können. Keine von ihnen ist in der Lage, die INSERT Abfrage durchzuführen.

+1

+1 für die angegebenen Informationen. –

+0

Was soll das erreichen? 'id = LAST_INSERT_ID (id)' –

+0

Noch denke ich, dass Sie die ID = LAST_INSERT_ID (id) entfernen sollten, wie ich in meiner Antwort hatte, was ich entfernte .. –

Antwort

1

Ein Krafteinfügung einer neuen Zeile (mit id, die sich von 253691 unterscheidet) scheint dieses Problem vorläufig gelöst zu haben. Ich bin mir immer noch nicht sicher, warum der Fehler aufgetreten ist.

Der Befehl I verwendet wurde:

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

und das System wieder normal funktioniert (für alle 4 Benutzer, für jede Verbindung). Ich werde die Frage als noch unbeantwortet lassen, da ich immer noch nicht weiß, was das Problem verursacht hat. Meine beste Vermutung wäre, dass es sich um einen möglichen MySQL-Bug handelt.

+0

Sie sollten ['check'] (http://dev.mysql.com/doc/refman/5.5/ en/myisamchk.html) der Tisch. Vielleicht war die Tabelle oder ein Index beschädigt. –