我有一个包含 95929357 条记录的 MySQL 表,下面是相同的表模式
CREATE TABLE `Friends` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`createdTime` datetime DEFAULT NULL,
`friendUserId` bigint(20) DEFAULT NULL,
`friendshipStatus` int(11) DEFAULT NULL,
`remarks` varchar(255) DEFAULT NULL,
`updatedTime` datetime DEFAULT NULL,
`userId` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `userId` (`userId`,`friendUserId`),
KEY `createdTime` (`createdTime`)
) ENGINE=InnoDB AUTO_INCREMENT=1321597934 DEFAULT CHARSET=latin1
我有两个问题要问
问题1# 如果只有95929357条记录,AUTO_INCREMENT怎么增加到1321597934(注意-条目是由默认值为0的代码插入的)。我还注意到,id 存在差距(exp- 从 id 50001124 到新的 id 50001393)
| 50001122 | 2021-09-19 03:33:06 | 116176872 | 0 | NULL | 2021-09-19 03:33:06 | 103802246 |
| 50001123 | 2021-09-19 03:33:06 | 114361519 | 0 | NULL | 2021-09-19 03:33:06 | 116176872 |
| 50001124 | 2021-09-19 03:33:06 | 116176872 | 0 | NULL | 2021-09-19 03:33:06 | 114361519 |
| 50001393 | 2021-09-19 03:33:07 | 109233877 | 0 | NULL | 2021-09-19 03:33:07 | 125715813 |
| 50001394 | 2021-09-19 03:33:07 | 125715813 | 0 | NULL | 2021-09-19 03:33:07 | 109233877 |
| 50001395 | 2021-09-19 03:33:07 | 105588884 | 0 | NULL | 2021-09-19 03:33:07 | 125715813 |
| 50001396 | 2021-09-19 03:33:07 | 125715813 | 0 | NULL | 2021-09-19 03:33:07 | 105588884 |
| 50001397 | 2021-09-19 03:33:07 | 106198652 | 0 | NULL | 2021-09-19 03:33:07 | 125715813 |
| 50001398 | 2021-09-19 03:33:07 | 125715813 | 0 | NULL | 2021-09-19 03:33:07 | 106198652 |
问题 2# 我正在尝试使用以下命令添加新列
ALTER TABLE Friends ADD COLUMN source INT(11) DEFAULT '0';
但是在表更改时低于错误
ERROR 1062 (23000): Duplicate entry '126750770-127846472' for key 'userId'
更新 -
选择上述键的结果
mysql> select * from Friends where userId = 126750770 AND friendUserId = 127846472;
+------------+---------------------+--------------+------------------+---------+---------------------+-----------+--------+
| id | createdTime | friendUserId | friendshipStatus | remarks | updatedTime | userId | source |
+------------+---------------------+--------------+------------------+---------+---------------------+-----------+--------+
| 1120753287 | 2022-01-27 12:36:12 | 127846472 | 0 | NULL | 2022-01-27 12:36:12 | 126750770 | 0 |
+------------+---------------------+--------------+------------------+---------+---------------------+-----------+--------+
1 row in set (0.00 sec)
mysql> select * from Friends where userId = 127846472 AND friendUserId = 126750770;
+------------+---------------------+--------------+------------------+---------+---------------------+-----------+--------+
| id | createdTime | friendUserId | friendshipStatus | remarks | updatedTime | userId | source |
+------------+---------------------+--------------+------------------+---------+---------------------+-----------+--------+
| 1120753288 | 2022-01-27 12:36:12 | 126750770 | 0 | NULL | 2022-01-27 12:36:12 | 127846472 | 0 |
+------------+---------------------+--------------+------------------+---------+---------------------+-----------+--------+
1 row in set (0.00 sec)
AUTO_INCREMENT
在:REPLACE
,INSERT IGNORE
,ROLLBACK
, IODKU 和其他中出现空白的原因有多种。请介绍一些类似插入的语句;我将提供进一步的细节。我假设您不知道 2021-09-19 03:33:07 发生了什么。Duplicate entry '126750770-127846472'
不应该发生。这令人担忧,就好像发生了一次没有从(不寻常的)充分恢复的崩溃。“268”会响铃吗?(这就是那里缺少多少个 id 。您是否在过去的某个时候从 MyISAM 转换为 InnoDB?
我建议你做更多的调查,从
这可能只是几个“复制键”之一。
让我们知道你发现什么。
附加建议
如果组合
(userId, friendUserId)
是唯一的,为什么不摆脱id
并提升 UNIQUEPRIMARY KEY(userId, friendUserId)
呢?这将节省空间并加快一些查询。id
任何其他表都可能没有用。改变
表上的长时间运行
ALTER
可能已经阻塞INSERTs
了足够长的时间以使它们超时。这可能会导致他们ROLLBACK'd
在 id 已经分配之后。