Mysql

在生產數據庫上添加新列期間Mysql重複輸入錯誤

  • February 25, 2022

我有一個包含 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?

我建議你做更多的調查,從

SELECT * FROM Friends
   WHERE userId = 126750770
     AND friend = 127846472;

這可能只是幾個“複製鍵”之一。

讓我們知道你發現什麼。

附加建議

如果組合(userId, friendUserId)是唯一的,為什麼不擺脫id並提升 UNIQUEPRIMARY KEY(userId, friendUserId)呢?這將節省空間並加快一些查詢。id任何其他表都可能沒有用。

改變

表上的長時間執行ALTER可能已經阻塞INSERTs了足夠長的時間以使它們超時。這可能會導致他們ROLLBACK'd在 id 已經分配之後。

引用自:https://dba.stackexchange.com/questions/307801