MySQL自增列的重復(fù)值問(wèn)題(r12筆記第25天)

   如果需要把一臺(tái)MySQL中的數(shù)據(jù)定期歸檔到另外一臺(tái)MySQL歷史庫(kù)中,那么很可能會(huì)發(fā)現(xiàn)會(huì)有重復(fù)值的問(wèn)題,導(dǎo)致數(shù)據(jù)導(dǎo)入會(huì)失敗,而這個(gè)問(wèn)題其實(shí)是和自增列的重復(fù)值有關(guān),我們來(lái)簡(jiǎn)單看看。

創(chuàng)新互聯(lián)建站成立以來(lái)不斷整合自身及行業(yè)資源、不斷突破觀念以使企業(yè)策略得到完善和成熟,建立了一套“以技術(shù)為基點(diǎn),以客戶(hù)需求中心、市場(chǎng)為導(dǎo)向”的快速反應(yīng)體系。對(duì)公司的主營(yíng)項(xiàng)目,如中高端企業(yè)網(wǎng)站企劃 / 設(shè)計(jì)、行業(yè) / 企業(yè)門(mén)戶(hù)設(shè)計(jì)推廣、行業(yè)門(mén)戶(hù)平臺(tái)運(yùn)營(yíng)、手機(jī)APP定制開(kāi)發(fā)移動(dòng)網(wǎng)站建設(shè)、微信網(wǎng)站制作、軟件開(kāi)發(fā)、成都服務(wù)器托管等實(shí)行標(biāo)準(zhǔn)化操作,讓客戶(hù)可以直觀的預(yù)知到從創(chuàng)新互聯(lián)建站可以獲得的服務(wù)效果。

   這方面丁奇大師也做了很多詳細(xì)的說(shuō)明,還定制了參數(shù),具體可以參見(jiàn) http://www.csdn.net/article/2015-01-16/2823591

    我們來(lái)看看這個(gè)問(wèn)題,由此做一個(gè)簡(jiǎn)單的總結(jié)。

我們創(chuàng)建一個(gè)表t1,指定存儲(chǔ)引擎為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條數(shù)據(jù),第一條指定id為1,后面兩條id值自增。

insert into t1 values (1,2);
insert into t1 values (null,2);
insert into t1 values (null,2);數(shù)據(jù)的分布情況如下:
[test]> select *from t1;               
+----+------+
| id | a    |
+----+------+
|  1 |    2 |
|  2 |    2 |
|  3 |    2 |
+----+------+到此為止,我們的數(shù)據(jù)初始化工作就完成了。

這個(gè)時(shí)候使用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的數(shù)據(jù)。

delete from t1 where id=2;
delete from t1 where id=3;

在此吐槽一句,MySQL竟然能夠支持下面這樣的語(yǔ)句,我都方了。

[test]> delete from t1 where id;
Query OK, 2 rows affected (0.00 sec)

當(dāng)然我們繼續(xù)往下做,查看刪除數(shù)據(jù)之后的情況,只保留了一條id為1的數(shù)據(jù)。

> select * from t1;
+----+------+
| id | a    |
+----+------+
|  1 |    2 |
+----+------+
1 row in set (0.00 sec)接下來(lái)我們?nèi)绻^續(xù)插入一條記錄,那么id就會(huì)是4.

但是我們不這么做,我們重啟MySQL。

service mysql stop
service mysql start然后插入一條記錄,這個(gè)時(shí)候id值是從2開(kāi)始計(jì)算了,而不是4.

insert into t1 values (null,2);
[test]> select *from t1;
+----+------+
| id | a    |
+----+------+
|  1 |    2 |
|  2 |    2 |
+----+------+
2 rows in set (0.00 sec)這個(gè)時(shí)候如果查看表定義信息,就會(huì)發(fā)現(xiàn)自增列目前是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,就不會(huì)出現(xiàn)這類(lèi)問(wèn)題,而對(duì)于InnoDB來(lái)說(shuō),它的自增列的實(shí)現(xiàn)在重啟之后內(nèi)存中肯定是沒(méi)有了,它是根據(jù)max(id)+1的方式來(lái)計(jì)算的。

這個(gè)情況不光是在MySQL 5.5存在,在MySQL 5.7也依舊存在。

而這類(lèi)問(wèn)題是否在數(shù)據(jù)遷移中會(huì)出現(xiàn)呢,我們也需要注意一下。

比如我們使用mysqldump導(dǎo)出數(shù)據(jù),然后導(dǎo)入到另外一個(gè)環(huán)境。

導(dǎo)出數(shù)據(jù)

mysqldump  test t1 > t1.sql 
導(dǎo)出的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 */;所以一個(gè)看起來(lái)很簡(jiǎn)單的數(shù)據(jù)庫(kù)重啟工作可能帶給我們的會(huì)有一些潛在的隱患。

分享名稱(chēng):MySQL自增列的重復(fù)值問(wèn)題(r12筆記第25天)
路徑分享:http://muchs.cn/article24/gedhce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、網(wǎng)站收錄、網(wǎng)站排名、微信小程序、品牌網(wǎng)站設(shè)計(jì)、定制開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司