Mysql
在生產數據庫上添加新列期間Mysql重複輸入錯誤
我有一個包含 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 已經分配之後。