Mysql擷取最大自增ID(auto_increment)

來源:互聯網
上載者:User

標籤:

 

  在關係型資料庫的表結構中,一般情況下,都會定義一個具有‘AUTO_INCREMENT’擴充屬性的‘ID’欄位,以確保資料表的每一條記錄都有一個唯一標識。

  而實際應用中,擷取到最近最大的ID值是必修課之一,針對於該問題,實踐整理如下:

   

1、建立測試資料表get_max_id

 

 mysql>CREATETABLE `get_max_id` (
   `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘業務主鍵‘,   `content` char(25) DEFAULT NULL COMMENT ‘業務內容‘,   PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

 

2、未初始化表擷取最大自增ID

  建立完資料表之後,我們知道,表中的內容暫時為空白,此時,查詢max(id)擷取到的內容將是NULL;

  方式1 - max(id):

    該方式的優點是簡單粗暴,直奔菊花,啊不是( ̄m ̄),直奔主題;

    同時,它無視其它用戶端串連(db_connection)的影響,可以直奔第3點位置;

mysql>select max(id) from get_max_id; +---------+ | max(id) | +---------+ |    NULL | +---------+ 1 row in set (0.00 sec)

  

  方式2 - LAST_INSERT_ID()函數:

    LAST_INERT_ID(),返回最後一個INSERT或 UPDATE 查詢中, AUTO_INCREMENT列設定的第一個表的值。

    這玩意兒的使用還是有些限制的:

     1、同一個Connection連線物件(同一用戶端)中,SELECT的結果為最後一次INSERT的AUTO_INCREMENT屬性列的ID。這句話的重點在於“同一個”,即其他串連的用戶端不對其查詢的結果造成影響。假設用戶端A和B,表ta原自增ID為3,在A中插入記錄後產生自增ID為4,在用戶端A中通過該函數查詢的結果為4,但在用戶端B中查詢的結果值仍為3;(已驗證)

     2、與表無關,即假設ta表和tb表,向ta插入記錄後,再向tb插入記錄,結果值為tb的max(id)值;(已驗證)

     3、使用非魔術方法(‘magic‘)來INSERT或UPDATE一條記錄時,即使用非0/非NULL值作為插入的欄位,則LAST_INSERT_ID()傳回值不會發生變化;(已驗證)

     4、同一條INSERT語句中,傳入多個VALUES值,則LAST_INSERT_ID()傳回值為該查詢第一條記錄的ID;(已驗證)

        5、在進階方面,可運用作分表ID的唯一性。

    初始化查詢的結果,得到的是0,這點和max(id)還是有區別的;

 

mysql>select LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ |                0 | +------------------+ 1 row in set (0.00 sec)

 

 

  方式3 - 查看錶狀態show table status

    該方式提供了當前DB(use db_name;)下每個表的基本資料;可以通過where條件擷取到Auto_increment屬性的值;

    下述提供的結果值,為下一個自增ID的數值。

mysql> show table status where Name=‘get_max_id‘;+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+| Name       | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options| Comment |+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+| get_max_id | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |            0 |  10485760 |              1 | 2015-04-20 11:49:07 | NULL        | NULL       | utf8_general_ci |     NULL |     |         |+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+1 row in set (0.00 sec)

  方式4 - information_schema.tables

    提供關於資料庫中的表(包括視圖)的資訊。詳細描述了某個表屬於哪個schema,表類型,表引擎等等資訊;

    下述提供的結果值,為下一個自增ID的數值。

mysql> select table_name, AUTO_INCREMENT from information_schema.tables where table_name="get_max_id";+------------+----------------+| table_name | AUTO_INCREMENT |+------------+----------------+| get_max_id |              1 |+------------+----------------+1 row in set (0.01 sec)

  方式5 - @@IDENTITY全域變數

    基礎:以@@開頭的變數為全域變數,而以@開頭的變數為使用者自訂的變數。

    此處 @@IDENTITY表示最近一次向具有identity屬性(auto_increment)的表INSERT資料時對應的自增列的值。此處得到的值是0。

    1、類似於LAST_INSERT_ID()函數,該方式必須在同一個用戶端內進行的INSERT與SELECT,且不受其他用戶端影響;(已驗證)

    2、與表無關;(已驗證)

    3、非魔術方法插入不影響結果值;(已驗證)

    4、同一INSERT插入多條記錄,取第一條記錄的ID值為結果;(已驗證)

mysql> select @@IDENTITY;+------------+| @@IDENTITY |+------------+|          0 |+------------+1 row in set (0.00 sec)

 

Mysql擷取最大自增ID(auto_increment)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.