Mysql獲取最大自增ID(auto_increment)的五種方式及其特色

在關係型數據庫的表結構中,通常狀況下,都會定義一個具備‘AUTO_INCREMENT’擴展屬性的‘ID’字段,以確保數據表的每一條記錄都有一個惟一標識。html

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

   

一、新建測試數據表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;

 

二、未初始化表獲取最大自增ID

  建立完數據表以後,咱們知道,表中的內容暫時爲空,此時,查詢max(id)獲取到的內容將是NULL;sql

  方式1 - max(id):數據庫

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

    同時,它無視其它客戶端鏈接(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列設置的第一個表的值。spa

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

     一、同一個Connection鏈接對象(同一客戶端)中,SELECT的結果爲最後一次INSERT的AUTO_INCREMENT屬性列的ID。這句話的重點在於「同一個」,即其餘鏈接的客戶端不對其查詢的結果形成影響。假設客戶端A和B,表ta原自增ID爲3,在A中插入記錄後產生自增ID爲4,在客戶端A中經過該函數查詢的結果爲4,但在客戶端B中查詢的結果值仍爲3;(已驗證)orm

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

     三、使用非魔術方法('magic')來INSERT或UPDATE一條記錄時,即便用非0/非NULL值做爲插入的字段,則LAST_INSERT_ID()返回值不會發生變化;(已驗證)

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

        五、在進階方面,可運用做分表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。

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

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

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

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

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

 

轉載來源: http://www.cnblogs.com/w3chen/p/4441512.html  

相關文章
相關標籤/搜索