設置自增列
十多年的大渡口網站建設經驗,針對設計、前端、開發、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。全網整合營銷推廣的優勢是能夠根據用戶設備顯示端的尺寸不同,自動調整大渡口建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優雅布局與設計,從而大程度地提升瀏覽體驗。創新互聯建站從事“大渡口網站設計”,“大渡口網站推廣”以來,每個客戶項目都認真落實執行。
MYSQL的自增列一定要是有索引的列,設置種子值要在表的后面設置
--mysql
-- 設置自增ID從N開始
CREATE TABLE empautoinc(
ID INT PRIMARY KEY AUTO_INCREMENT
) AUTO_INCREMENT = 100 ; --(設置自增ID從100開始)
insert into empautoinc(id) values(null);
Query OK, 1 row affected (0.00 sec)
mysql select * from empautoinc;
+-----+
| ID |
+-----+
| 100 |
+-----+
1 row in set (0.00 sec)
show table status like 'empautoinc'G;
*************************** 1. row ***************************
Name: empautoinc
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 1
Avg_row_length: 16384
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: 101
Create_time: 2016-10-27 01:50:32
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
設置自增列的步長,可以分為全局級別和會話級別
如果是會話級別,那么當用戶新建一個會話的時候,那么步長又回到了全局級別,所以mysql的步長跟sqlserver的步長有很大的不同
mysql不能設置為 表級別 的步長
私信666領取資料
1、如果是已經建好的表:
id列自增的話,先給id列加索引
alter table 表名 add index id(id);
再設置自增屬性:
alter table modify id int auto_increment;
2、如果是未建立的表,直接建立的時候設置就好.給了id主鍵
create table t(id int not null primary key auto_increment)
1、清空表,恢復到初始值:
2、修改為任意值:
上述語句中,table_name為表名,15為要修改的值,這樣下次插入的數據的自增列的值就是15。
若修改的值與現有數據沖突,會自動修改為當前最大值+1。
如圖所示,修改自增列id為11,雖然顯示修改成功,但是id=11已經是現有值,再插入時會自動把自增列的值變為當前最大值(14)加1,也就是15
alter table questionlib modify id?int(11) auto_increment;
注意事項:
修改后從下一條記錄開始自動增長。如果想讓原來的自動增長就得復制現有表的結構(無id),添加id并加上AUTO_INCREMENT,然后通過循環,添加n條空記錄,然后對應先前表的id,依次插入數據。
擴展資料:
mysql自動增長開始值設置總結
1、創建表,設置表主鍵id自動增長,默認自動增長的起始值為1開始。
2、當表數據不為空的時候,重新去修改自動增長id開始值,mysql會主動去核對你設置的起始值是否是當前數據庫已有id的最大值+1; 若是則修改成功,若不是則修改不成功 (默認還是id最大值+1)
3、要設置自動增長為1開始,需要清空表數據才行。alter table table_name AUTO_INCREMENT=1
4、若每次直接在數據庫里面插入數據,則會自動的去修改當前表的自動增長起始值(設置自動增長起始值為當前插入成功的數據的id)
create table cdat
(
localt char(20) not null,
cd char(5) not null,
snosat char(2) not null,
rnorec char(3) not null,
id INT(20) not null AUTO_INCREMENT,
primary key (id)
);
MySQL是一個開放源碼的小型關聯式數據庫管理系統,開發者為瑞典MySQL AB公司。目前MySQL被廣泛地應用在Internet上的中小型網站中。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,許多中小型網站為了降低網站總體擁有成本而選擇了MySQL作為網站數據庫。
系統特性
1.使用C和C++編寫,并使用了多種編譯器進行測試,保證源代碼的可移植性
2.支持AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多種操作系統
3.為多種編程語言提供了API。這些編程語言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
4.支持多線程,充分利用CPU資源
5.優化的SQL查詢算法,有效地提高查詢速度
6.既能夠作為一個單獨的應用程序應用在客戶端服務器網絡環境中,也能夠作為一個庫而嵌入到其他的軟件中。
7.提供多語言支持,常見的編碼如中文的GB 2312、BIG5,日文的Shift_JIS等都可以用作數據表名和數據列名。
8.提供TCP/IP、ODBC和JDBC等多種數據庫連接途徑。
9.提供用于管理、檢查、優化數據庫操作的管理工具。
10.支持大型的數據庫。可以處理擁有上千萬條記錄的大型數據庫。
11.支持多種存儲引擎。
索引功能
索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),它們包含著對數據表里所有記錄的引用指針。索引不是萬能的,索引可以加快數據檢索操作,但會使數據修改操作變慢。每修改數據記錄,索引就必須刷新一次。為了在某種程序上彌補這一缺陷,許多SQL命令都有一個DELAY_KEY_WRITE項。這個選項的作用是暫時制止MySQL在該命令每插入一條新記錄和每修改一條現有之后立刻對索引進行刷新,對索引的刷新將等到全部記錄插入/修改完畢之后再進行。在需要把許多新記錄插入某個數據表的場合,DELAY_KEY_WRITE選項的作用將非常明顯。另外,索引還會在硬盤上占用相當大的空間。因此應該只為最經常查詢和最經常排序的數據列建立索引。注意,如果某個數據列包含許多重復的內容,為它建立索引就沒有太大的實際效果。從理論上講,完全可以為數據表里的每個字段分別建一個索引,但MySQL把同一個數據表里的索引總數限制為16個。
1.InnoDB數據表的索引
與InnoDB數據表相比,在InnoDB數據表上,索引對InnoDB數據表的重要性要大得多。在InnoDB數據表上,索引不僅會在搜索數據記錄時發揮作用,還是數據行級鎖定機制的苊、基礎。“數據行級鎖定”的意思是指在事務操作的執行過程中鎖定正在被處理的個別記錄,不讓其他用戶進行訪問。這種鎖定將影響到(但不限于)SELECT、LOCKINSHAREMODE、SELECT、FORUPDATE命令以及INSERT、UPDATE和DELETE命令。出于效率方面的考慮,InnoDB數據表的數據行級鎖定實際發生在它們的索引上,而不是數據表自身上。顯然,數據行級鎖定機制只有在有關的數據表有一個合適的索引可供鎖定的時候才能發揮效力。
2.限制
如果WHERE子句的查詢條件里有不等號(WHEREcoloum!=),MySQL將無法使用索引。類似地,如果WHERE子句的查詢條件里使用了函數(WHEREDAY(column)=),MySQL也將無法使用索引。在JOIN操作中(需要從多個數據表提取數據時),MySQL只有在主鍵和外鍵的數據類型相同時才能使用索引。
如果WHERE子句的查詢條件里使用比較操作符LIKE和REGEXP,MySQL只有在搜索模板的第一個字符不是通配符的情況下才能使用索引。比如說,如果查詢條件是LIKE'abc%‘,MySQL將使用索引;如果查詢條件是LIKE'%abc’,MySQL將不使用索引。
在ORDERBY操作中,MySQL只有在排序條件不是一個查詢條件表達式的情況下才使用索引。(雖然如此,在涉及多個數據表查詢里,即使有索引可用,那些索引在加快ORDERBY方面也沒什么作用)。如果某個數據列里包含許多重復的值,就算為它建立了索引也不會有很好的效果。比如說,如果某個數據列里包含的凈是些諸如“0/1”或“Y/N”等值,就沒有必要為它創建一個索引。
MYSQL的自增列在實際生產中應用的非常廣泛,相信各位所在的公司or團隊,MYSQL開發規范中一定會有要求盡量使用自增列去充當表的主鍵,為什么DBA會有這樣的要求,各位在使用MYSQL自增列時遇到過哪些問題?這些問題是由什么原因造成的呢?本文由淺入深,帶領大家徹底弄懂MYSQL的自增機制。
1.? 通過auto_increment關鍵字來指定自增的列,并指定自增列的初始值為1。
[root@localhost][test1]Create table t(id int auto_increment ,namevarchar(10),primary key(id))auto_increment=1;
QueryOK, 0 rows affected (0.63 sec)
2.? 自增列上必須有索引,將t表的主鍵索引刪除掉,會報錯
[root@localhost][test1]alter table t drop primary key;
ERROR1075 (42000): Incorrect table definition; there can be only one auto column andit must be defined as a key
3.? 設定auto_increment_increment參數,可以調整自增步長,該參數有session級跟global級,在分庫分表以及雙主or多主的模式下比較有用。
4.? 一個表上只能有一個自增列
5.? Mysql5.7及以下版本,innodb表的自增值保存在內存中,重啟后表的自增值會設為max(id)+1,而myisam引擎的自增值是保存在文件中,重啟不會丟失。Mysql8.0開始,innodb的自增id能持久化了,重啟mysql,自增ID不會丟。
首先:表中自增列的上限是根據自增列的字段類型來定的。
若設定了自增id充當主鍵,當達到了自增id的上限值時,會發生什么樣的事情呢?還是以上面創建的 t表為例, 先回顧它的表結構:
CREATETABLE `t` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) COLLATE utf8mb4_binDEFAULT NULL,
PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
無符號的int類型,上限是2147483647。這里我們將表的自增值設為2147483647,再插入兩行數據:
[root@localhost][test1]alter table t auto_increment=2147483647;
QueryOK, 0 rows affected (0.01 sec)
Records:0? Duplicates: 0? Warnings: 0
[root@localhost][test1]insert into t(name) values ('test');??????????
QueryOK, 1 row affected (0.01 sec)
[root@localhost][test1]insert into t(name) values ('test');
ERROR 1062 (23000): Duplicate entry '2147483647' for key 'PRIMARY'
可以看到,第一個插入沒問題,因為自增列的值為2147483647,這是達到了上限,還沒有超過,第二行數據插入時,則報出主鍵重復,在達到上限后,無法再分配新的更大的自增值,也沒有從1開始從頭分配,在這里表的auto_increment值會一直是2147483647。
對于寫入量大,且經常刪除數據的表,自增id設為int類型還是偏小的,所以我們為了避免出現自增id漲滿的情況,這邊統一建議自增id的類型設為unsigned bingint,這樣基本可以保障表的自增id是永遠夠用的。
這里內容比較多,innodb是索引組織表,所以涉及到索引的知識,但這不是本文的重點,我們快速回顧索引知識:
1.? Innodb索引分為主鍵跟輔助索引,主鍵即全表,輔助索引葉子節點保存主鍵的值,而主鍵的葉子節點保存數據行,中間節點存著葉子節點的路由值。
2.? Innodb存儲數據(索引)的單位是頁,這里默認是16K,這也意味著,數據本身越小,一個頁中能存數據的量越多,而檢索效率不僅僅由索引的層數來決定,更是由一次能夠緩存的數據量來定,也就是說數據本身越小,則一次IO能夠提取到緩沖區的數據越多(OS每次IO的量是固定的4K),查詢的效率越好。
其實能夠理解索引的結構及索引寫入插入、更新的原理,則自然就明白為何建議使用自增id。這里我直接列出使用自增id 當主鍵的好處吧:
1.? 順序寫入,避免了葉的分裂,數據寫入效率好
2.? 縮小了表的體積,特別是相比于UUID當主鍵,甚至組合字段當主鍵時,效果更明顯
3.? 查詢效率好,原因就是我上面說到索引知識的第二點。
4.? 某些情況下,我們可以利用自增id來統計大表的大致行數。
5.? 在數據歸檔or垃圾數據清理時,也可方便的利用這個id去操作,效率高。
容易出現不連續的id
有的同志會發現,自己的表中id值存在空洞,如類似于1、2、3、8、9、10這樣,有的適合有想依賴于自增id的連續性來實現業務邏輯,所以會想方設法去修改id讓其變的連續,其實,這是沒有必要的,這一塊的業務邏輯交由MySQL實現是很不理智的,表的記錄小還好,要是表的數據量很大,修改起來就糟糕了。那么,為什么自增id會容易出現空洞呢?
自增id的修改機制如下:
在MySQL里面,如果字段id被定義為AUTO_INCREMENT,在插入一行數據的時候,自增值的行為如下:
1. 如果插入數據時id字段指定為0、null 或未指定值,那么就把這個表當前的
AUTO_INCREMENT值填到自增字段;
2. 如果插入數據時id字段指定了具體的值,就直接使用語句里指定的值。
根據要插入的值和當前自增值的大小關系,自增值的變更結果也會有所不同。假設,某次要插入的值是X,當前的自增值是Y。
1. 如果XY,那么這個表的自增值不變;
2. 如果X≥Y,就需要把當前自增值修改為 新的自增值 。
新的自增值生成算法是:從auto_increment_offset開始,以auto_increment_increment為步長,持續疊加,直到找到第一個大于X的值,作為新的自增值。
Insert、update、delete操作會讓id不連續。
Delete、update:刪除中間數據,會造成空動,而修改自增id值,也會造成空洞(這個很少)。
Insert:插入報錯(唯一鍵沖突與事務回滾),會造成空洞,因為這時候自增id已經分配出去了,新的自增值已經生成,如下面例子:
[root@localhost][test1] select * fromt;
+----+------+
| id | name |
+----+------+
|? 1| aaa? |
|? 2| aaa? |
|? 3| aaa? |
|? 4| aaa? |
+----+------+
4 rows in set (0.00 sec)
[root@localhost][test1] selectAuto_increment from information_schema.tables where table_name='t';
+----------------+
| Auto_increment |
+----------------+
|????????????? 5 |
+----------------+
1 row in set (0.00 sec)
[root@localhost][test1] begin;
Query OK, 0 rows affected (0.00 sec)
[root@localhost][test1] insert intot(name) values('aaa');
Query OK, 1 row affected (0.00 sec)
[root@localhost][test1] select * fromt;
+----+------+
| id | name |
+----+------+
|? 1| aaa? |
|? 2| aaa? |
|? 3| aaa? |
|? 4| aaa? |
|? 5| aaa? |
+----+------+
5 rows in set (0.00 sec)
[root@localhost][test1] selectAuto_increment from information_schema.tables where table_name='t';
+----------------+
| Auto_increment |
+----------------+
|????????????? 6 |
+----------------+
1 row in set (0.00 sec)
[root@localhost][test1] rollback;
Query OK, 0 rows affected (0.00 sec)
[root@localhost][test1] selectAuto_increment from information_schema.tables where table_name='t';
+----------------+
| Auto_increment |
+----------------+
|????????????? 6 |
+----------------+
1 row in set (0.01 sec)
[root@localhost][test1] select * fromt;
+----+------+
| id | name |
+----+------+
|? 1| aaa? |
|? 2| aaa? |
|? 3| aaa? |
|? 4| aaa? |
+----+------+
4 rows in set (0.00 sec)
可以看到,雖然事務回滾了,但自增id已經回不到從前啦,唯一鍵沖突也是這樣的,這里就不做測試了。
在批量插入時(insert select等),也存在空洞的問題。看下面實驗:
[root@localhost][test1] select * fromt;
+----+------+
| id | name |
+----+------+
|? 1| aaa? |
|? 2| aaa? |
|? 3| aaa? |
|? 4| aaa? |
+----+------+
4 rows in set (0.00 sec)
[root@localhost][test1] selectAuto_increment from information_schema.tables where table_name='t';
+----------------+
| Auto_increment |
+----------------+
|????????????? 5 |
+----------------+
1 row in set (0.00 sec)
[root@localhost][test1] insert intot(name) select name from t;??????????????????????
Query OK, 4 rows affected (0.04 sec)
Records: 4?Duplicates: 0? Warnings: 0
[root@localhost][test1] select * fromt;
+----+------+
| id | name |
+----+------+
|? 1| aaa? |
|? 2| aaa? |
|? 3| aaa? |
|? 4| aaa? |
|? 5| aaa? |
|? 6| aaa? |
|? 7| aaa? |
|? 8| aaa? |
+----+------+
8 rows in set (0.00 sec)
[root@localhost][test1] selectAuto_increment from information_schema.tables where table_name='t';
+----------------+
| Auto_increment |
+----------------+
|???????????? 12 |
+----------------+
1 row in set (0.00 sec)
可以看到,批量插入,導致下一個id值不為9了,再插入數據,即產生了空洞,這里是由mysql申請自增值的機制所造成的,MySQL在批量插入時,若一個值申請一個id,效率太慢,影響了批量插入的速度,故mysql采用下面的策略批量申請id。
1.? 語句執行過程中,第一次申請自增id,會分配1個;
2.? 1個用完以后,這個語句第二次申請自增id,會分配2個;
3.? 2個用完以后,還是這個語句,第三次申請自增id,會分配4個;
4.? 依此類推,同一個語句去申請自增id,每次申請到的自增id個數都是上一次的兩倍。
在對自增列進行操作時,存在著自增鎖,mysql的innodb_autoinc_lock_mode參數控制著自增鎖的上鎖機制。該參數有0、1、2三種模式:
0:語句執行結束后釋放自增鎖,MySQL5.0時采用這種模式,并發度較低。
1:mysql的默認設置。普通的insert語句申請后立馬釋放,insert select、replace insert、load data等批量插入語句要等語句執行結束后才釋放,并發讀得到提升
2:所有的語句都是申請后立馬釋放,并發度大大提升!但是在binlog為statement格式時,主從數據會發生不一致。這一塊網上有很多介紹,我不做介紹了。
在徹底了解了MYSQL的自增機制以后,在實際生產中就能靈活避坑,這里建議不要用自增id值去當表的行數,當需要對大表準確統計行數時,可以去count(*)從庫,如果業務很依賴大表的準確行數,直接弄個中間表來統計,或者考慮要不要用mysql的innodb來存儲數據,這個是需要自己去權衡。另外對于要求很高的寫入性能,但寫入量又比較大的業務,自增id的使用依然存在熱點寫入的問題,存在性能瓶頸,這時候可通過分庫分表來解決。
新聞名稱:mysql怎么寫自增列 mysql自增語句怎么寫
文章網址:http://m.newbst.com/article28/hpdojp.html
成都網站建設公司_創新互聯,為您提供App開發、電子商務、搜索引擎優化、響應式網站、品牌網站制作、面包屑導航
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯