mysql怎么自動增長 mysql中自動增長

mysql怎么讓自增長的

1、創建表時指定AUTO_INCREMENT自增值的初始值(即起始值):

在解放等地區,都構建了全面的區域性戰略布局,加強發展的系統性、市場前瞻性、產品創新能力,以專注、極致的服務理念,為客戶提供成都網站設計、做網站 網站設計制作按需網站設計,公司網站建設,企業網站建設,品牌網站設計,全網營銷推廣,成都外貿網站建設公司,解放網站建設費用合理。

CREATE TABLE XXX (ID INT(5) PRIMARY KEY AUTO_INCREMENT) AUTO_INCREMENT=100;

2、通過 ALTER TABLE 修改初始值(但是要大于表中的 AUTO_INCREMENT 自增值,否則設置無效):

ALTER TABLE XXX AUTO_INCREMENT=100;

3、如果自增序列的最大值被刪除了,則在插入新記錄時,該值被重用:

就是說如果表中原本有AUTO_INCREMENT屬性值連續為78、100的值,但100這個數據被刪除了,下此再添加數據的時候自增值為101,100被重用了。

即使在你將整個表中的所有數據delete清空后,之前的自增序列最大值還是會被重用。

解決辦法是:

使用 ALTER TABLE XXX AUTO_INCREMENT=0; 重新設置自增初始值。

Mysql數據庫中,設置id為自動增加,向數據庫中插入數據時,SQL語句怎么寫?

在建立表的時候設置id為自動增長的 [id] [int] IDENTITY (1, 1)

SQL語句是insert into ?user(name,passwd) values (name? ,passwd)。新增一條數據 id 就會自動加1

INSERT INTO是sql數據庫中的語句,可以用于向表格中插入新的行。

擴展資料

(1) 數據記錄篩選:

sql="select * from 數據表 where字段名=字段值 order by字段名[desc]"(按某個字段值降序排列。默認升序ASC)

sql="select * from 數據表 where字段名like '%字段值%' order by 字段名 [desc]"

sql="select top 10 * from 數據表 where字段名=字段值 order by 字段名 [desc]"

sql="select top 10 * from 數據表 order by 字段名 [desc]"

sql="select * from 數據表 where字段名in ('值1','值2','值3')"

sql="select * from 數據表 where字段名between 值1 and 值2"

(2) 更新數據記錄:

sql="update 數據表 set字段名=字段值 where 條件表達式"

sql="update 數據表 set 字段1=值1,字段2=值2 ?? 字段n=值n where 條件表達式"

(3) 刪除數據記錄:

sql="delete from 數據表 where 條件表達式"

sql="delete from 數據表" (將數據表所有記錄刪除)

(4) 添加數據記錄:

sql="insert into 數據表 (字段1,字段2,字段3 ?) values (值1,值2,值3 ?)"

sql="insert into 目標數據表 select * from 源數據表" (把源數據表的記錄添加到目標數據表)

(5) 數據記錄統計函數:

AVG(字段名) 得出一個表格欄平均值

COUNT(*;字段名) 對數據行數的統計或對某一欄有值的數據行數統計

MAX(字段名) 取得一個表格欄最大的值

MIN(字段名) 取得一個表格欄最小的值

SUM(字段名) 把數據欄的值相加

引用以上函數的方法:

sql="select sum(字段名) as 別名 from 數據表 where 條件表達式"

set rs=conn.excute(sql)

用 rs("別名") 獲取統計的值,其它函數運用同上。

查詢去除重復值:select distinct * from table1

(6) 數據表的建立和刪除:

CREATE TABLE 數據表名稱(字段1 類型1(長度),字段2 類型2(長度) ?? )

(7) 單列求和:

SELECT SUM(字段名) FROM 數據表

參考資料——百度百科SQL insert into

如何在MYSQL插數據 ID自增

如何在MYSQL插數據ID自增的方法。

如下參考:

1.在添加字段之前,第一個應該首先檢查當前tb1表的結構,如下圖所示。

2.實例字段列添加到表,如下所示。

3.再次看表結構和比較之前和之后的情況添加字段,如下圖所示。

4.最后,插入新的數據行看到的樣子,最后添加自動增長的字段,如下所示。

注意事項:

MySQL使用的SQL語言是訪問數據庫最常用的標準語言。MySQL軟件采用雙重許可政策,分為社區版,商業版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特性,一般中小網站開發選擇MySQL作為數據庫。

一文讓你徹底弄懂MySQL自增列

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里添加一個自動增長的ID字段

以插入語句的方法來解決此問題。

如下參考:

1.在添加字段之前,第一個zd應該首先檢查tb1表的當前結構。

2.將字段列instance添加到表中,如下圖。

3.再次查看表結構,比較添加字段之前和之后的情況。

4.最后,插入新的數據行,看看它是什么樣子,最后就加入了自動增長字段如下圖。

注意事項:

MySQL使用的SQL語言是訪問數據庫最常用的標準化語言。MySQL軟件采用雙重許可政策,分為社區版和商業版,由于其體積小,速度快,整體擁有成本低,尤其是開源這一特點,一般中小型網站開發都選擇MySQL作為網站數據庫。

本文名稱:mysql怎么自動增長 mysql中自動增長
鏈接地址:http://m.kartarina.com/article16/hggpgg.html

成都網站建設公司_創新互聯,為您提供面包屑導航外貿建站全網營銷推廣微信公眾號手機網站建設ChatGPT

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

猜你還喜歡下面的內容