MySQL自增列的重複值問題(r12筆記第25天)
如果需要把一臺MySQL中的資料定期歸檔到另外一臺MySQL歷史庫中,那麼很可能會發現會有重複值的問題,導致資料匯入會失敗,而這個問題其實是和自增列的重複值有關,我們來簡單看看。
這方面丁奇大師也做了很多詳細的說明,還定製了引數,具體可以參見
我們來看看這個問題,由此做一個簡單的總結。
我們建立一個表t1,指定儲存引擎為InnoDB
use test;
[test]> drop table if exists t1;
Query OK, 0 rows affected, 1 warning (0.01 sec)
> create table t1(id int auto_increment, a int, primary key (id)) engine=innodb;
Query OK, 0 rows affected (0.02 sec)然後插入3條資料,第一條指定id為1,後面兩條id值自增。
insert into t1 values (1,2);
insert into t1 values (null,2);
insert into t1 values (null,2);資料的分佈情況如下:
[test]> select *from t1;
+----+------+
| id | a |
+----+------+
| 1 | 2 |
| 2 | 2 |
| 3 | 2 |
+----+------+到此為止,我們的資料初始化工作就完成了。
這個時候使用show create table檢視,定義資訊中自增列的值為4,即再插入一條記錄,id值為4.
> show create table t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`a` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)我們接著清理id為2和3的資料。
delete from t1 where id=2;
delete from t1 where id=3;
在此吐槽一句,MySQL竟然能夠支援下面這樣的語句,我都方了。
[test]> delete from t1 where id;
Query OK, 2 rows affected (0.00 sec)
當然我們繼續往下做,檢視刪除資料之後的情況,只保留了一條id為1的資料。
> select * from t1;
+----+------+
| id | a |
+----+------+
| 1 | 2 |
+----+------+
1 row in set (0.00 sec)接下來我們如果繼續插入一條記錄,那麼id就會是4.
但是我們不這麼做,我們重啟MySQL。
service mysql stop
service mysql start然後插入一條記錄,這個時候id值是從2開始計算了,而不是4.
insert into t1 values (null,2);
[test]> select *from t1;
+----+------+
| id | a |
+----+------+
| 1 | 2 |
| 2 | 2 |
+----+------+
2 rows in set (0.00 sec)這個時候如果檢視錶定義資訊,就會發現自增列目前是3
> show create table t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`a` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
這是什麼原因呢,如果你試試MyISAM,就不會出現這類問題,而對於InnoDB來說,它的自增列的實現在重啟之後記憶體中肯定是沒有了,它是根據max(id)+1的方式來計算的。
這個情況不光是在MySQL 5.5存在,在MySQL 5.7也依舊存在。
而這類問題是否在資料遷移中會出現呢,我們也需要注意一下。
比如我們使用mysqldump匯出資料,然後匯入到另外一個環境。
匯出資料
mysqldump test t1 > t1.sql
匯出的sql文字如下,可以看到裡面是指定id值的方式,而非空。
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
INSERT INTO `t1` VALUES (1,2),(2,2);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;所以一個看起來很簡單的資料庫重啟工作可能帶給我們的會有一些潛在的隱患。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2136679/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL自增列主從不一致的測試(r12筆記第37天)MySql筆記
- 如何解決自增列賦值的問題賦值
- MySQL無法建立表的問題分析(r12筆記第73天)MySql筆記
- MySQL自增列ID的面試題MySql面試題
- MySQL·8.0.0新特性·持久化自增列值MySql持久化
- MySQL中的derived table(r12筆記第47天)MySql筆記
- mysql自增列MySql
- MySQL中的自增列MySql
- java map存取重複值、幼兒園分班問題、map按key自動排序問題Java排序
- MySQL主從不一致發現的細小問題分析(r12筆記第63天)MySql筆記
- MySQL數值型別在binlog中需要注意的細節(r12筆記第69天)MySql型別筆記
- 一個ORA-00600問題的簡單分析(r12筆記第18天)筆記
- MySQL原始碼安裝總結(r12筆記第12天)MySql原始碼筆記
- MySQL中的binlog和redo淺析(r12筆記第5天)MySql筆記
- 關於SQL的重複記錄問題SQL
- MySQL傳輸表空間小結(r12筆記第2天)MySql筆記
- MySQL service啟動指令碼淺析(r12筆記第59天)MySql指令碼筆記
- 通過shell指令碼模擬MySQL自增列的不一致問題指令碼MySql
- 歸零的心態(r12筆記第82天)筆記
- mysqlpump的效能測試(r12筆記第89天)MySql筆記
- 相同update語句在MySQL,Oracle的不同表現(r12筆記第30天)MySqlOracle筆記
- MySQL order by limit 分頁資料重複問題MySqlMIT
- Silverlight 2 學習筆記之事件的重複繫結問題筆記事件
- 使用pt工具檢測MySQL主從延遲(r12筆記第7天)MySql筆記
- 在eclipse中配置MySQL原始碼環境(r12筆記第14天)EclipseMySql原始碼筆記
- 分分鐘搭建MySQL一主多從環境(r12筆記第31天)MySql筆記
- 我爸爸眼中的我(r12筆記第22天)筆記
- 一個IT人和ppt的故事(r12筆記第39天)筆記
- 我的女兒二三事(七)(r12筆記第58天)筆記
- 玩足彩的一點感受(r12筆記第80天)筆記
- MySQL中的半同步複製(r11筆記第65天)MySql筆記
- sql重複插入問題SQL
- 分分鐘搭建MySQL Group Replication測試環境(二)(r12筆記第41天)MySql筆記
- db2中刪除重複記錄的問題DB2
- 有重複元素的排列問題
- 配置Mysql Group Replication遇到的問題筆記MySql筆記
- mysqldump的一點使用總結(r12筆記第81天)MySql筆記
- 駕考的一點總結(r12筆記第93天)筆記