对于我在特定表中尝试的每个INSERT查询,键'PRIMARY'的重复条目

hjp*_*r92 7 mysql sql primary-key duplicates sql-insert

我有以下表结构(SHOW CREATE刚才使用命令):

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;
Run Code Online (Sandbox Code Playgroud)

现在,我只是获取一些最近的值(我已经更改了IP用于演示):

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 |
+--------+----------------+--------+---------------------+
Run Code Online (Sandbox Code Playgroud)

在此之后,我将尝试执行一个简单的INSERT声明:

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`)
Run Code Online (Sandbox Code Playgroud)

其中值10.3.100.244尚未存在于表中.它导致:

ERROR 1062 (23000): Duplicate entry '253691' for key 'PRIMARY'
Run Code Online (Sandbox Code Playgroud)

选择LAST_INSERT_ID给出:

mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                0 |
+------------------+
Run Code Online (Sandbox Code Playgroud)

如果那不是奇怪的行为; 我将尝试插入已存在的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'
Run Code Online (Sandbox Code Playgroud)

我现在正式对MySQL的这种行为感到困惑.所有其他查询在正在运行的所有其他进程中正常工作.当我尝试错误只发生INSERTipstats表.我甚至尝试了以下方法:

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'
Run Code Online (Sandbox Code Playgroud)

可能是什么问题呢?我该如何解决这个问题?错误自今天下午以来一直在发生,我以前从未遇到过这样的问题.

PS:MySQL安装中的所有用户帐户都会出错.有4个用户(包括root用户)可以访问数据库.他们都不能执行INSERT查询.

hjp*_*r92 1

强制插入新行(与id不同253691)现在似乎已经解决了这个问题。我仍然不确定为什么会发生错误。

我使用的命令是:

INSERT INTO `ipstats` (id, ip, online, last_used)
VALUES ( 253699, '10.204.102.38', 'n', NOW() );
Run Code Online (Sandbox Code Playgroud)

并且系统再次正常工作(对于所有 4 个用户,每个连接)。我将把这个问题保留为悬而未决,因为我仍然不知道是什么导致了这个问题。我最好的猜测是这可能是 MySQL 的错误。