Mysql----MySQL的mysql_insert_id和LAST_INSERT_ID(轉)


本文介紹的是mysql中last_insert_id和mysql_insert_id的區別

1 mysql_insert_id
  一、PHP獲取MYSQL新插入數據的ID
    mysql_insert_id();
  二、
    php5和新增了獲取最新插入值的ID的函數:mysqli_insert_id($conn),和之前的mysql_insert_id()類似。
    都是用在insert語句之后獲取最新的自動id號,要注意的是mysqli_insert_id(),括號里面的一定要是數據庫連接而不是執行結果$result。
    程序實例:

$conn = new mysqli("127.0.0.1","root","","newssys") or die("數據庫連接超時!");
$sql = "insert into tableA(name,url) values('測試','http://www.ceshi.com')";
$result = $conn->query($sql) or die("失敗");
echo mysqli_insert_id($conn); //輸出剛剛插入數據的ID,注意:括號里面的要是$conn而不是$result
mysql

2 簡單介紹

MySQL的LAST_INSERT_ID用法舉例
首先看個例子(主鍵是自增長):

[sql] 
mysql> insert into bankaccount(name,balance) values('123', 1000); 
Query OK, 1 row affected (0.06 sec) 

mysql> insert into bankstatement(action, txdate, amt, toaccno, fromaccno) values 
('122', curdate(), 1000, 1, 2); 
Query OK, 1 row affected (0.00 sec) 
www.2cto.com 
mysql> select last_insert_id(); 
+------------------+ 
| last_insert_id() | 
+------------------+ 
| 7 | 
+------------------+ 
1 row in set (0.00 sec) 

mysql> select * from bankaccount; 
+-------+------+---------+ 
| accno | name | balance | 
+-------+------+---------+ 
| 1 | 張三 | 200 | 
| 2 | 李四 | 900 | 
| 3 | 123 | 1000 | 
| 4 | 123 | 1000 | 
+-------+------+---------+ 
4 rows in set (0.00 sec) 
www.2cto.com 
mysql> select * from bankstatement; 
+----+--------------+------------+------+---------+-----------+ 
| id | action | txdate | amt | toaccno | fromaccno | 
+----+--------------+------------+------+---------+-----------+ 
| 1 | 開戶 | 2012-10-14 | 100 | NULL | 1 | 
| 2 | 開戶 | 2012-10-14 | 1000 | NULL | 2 | 
| 3 | 查找賬戶信息 | 2012-10-14 | 0 | NULL | 2 | 
| 4 | 查找賬戶信息 | 2012-10-14 | 0 | NULL | 1 | 
| 5 | 轉賬 | 2012-10-14 | 100 | 1 | 2 | 
| 6 | 122 | 2012-10-14 | 1000 | 1 | 2 | 
| 7 | 122 | 2012-10-14 | 1000 | 1 | 2 | 
+----+--------------+------------+------+---------+-----------+ 
7 rows in set (0.00 sec) 
View Code

3 使用MySQL的LAST_INSERT_ID來確定各分表的唯一ID值


MySQL數據表結構中,一般情況下,都會定義一個具有‘AUTO_INCREMENT’擴展屬性的‘ID’字段,以確保數據表的每一條記錄都可以用這個ID唯一確定;

隨着數據的不斷擴張,為了提高數據庫查詢性能,降低查詢熱點,一般都會把一張表按照一定的規則分成多張數據表,即常說的分表;

分表除了表名的索引不同之外,表結構都是一樣的,如果各表的‘ID’字段仍采用‘AUTO_INCREMENT’的方式的話,ID就不能唯確定一條記錄了。

這時就需要一種處於各個分表之外的機制來生成ID,我們一般采用一張單獨的數據表(不妨假設表名為‘ticket_mutex’)來保存這個ID,無論哪個分表有數據增加時,都是先到ticket_mutex表把ID值加1,然后取得ID值。

這個取ID的操作看似很復雜,所幸的是,MySQL提供了LAST_INSERT_ID機制,讓我們能一步完成。

1、新建數據表ticket_mutex

CREATE TABLE ticket_mutex
(
name varchar(32)NOT NULL PRIMARY KEY COMMENT'業務名稱',
valuebigint(20)
UNSIGNED NOT NULL COMMENT'ID值'
)Engine=InnoDBDEFAULT CHARSET=UTF8
COMMENT '保存分表ID表';
字段‘name’用來說明這個ID是哪個業務的,比如‘用戶’的ID,我們可以定為‘USER’;
字段‘value’即該業務的ID值。
create table

 

2、初始化業務和其ID值
INSERT INTO ticket_mutex(name,
value) values('USER',
0),('POST',
0);
+------+-------+
|name |
value |
+------+-------+
|
POST | 0 |
|USER |
0 |
+------+-------+
我們初始化了2條記錄,即有2個不同的業務,分別代表‘用戶信息’和‘主題信息’,它們初始ID值均為‘0’;

3、獲取分表唯一ID
這個時候就要利用MySQL提供的LAST_INSERT_ID()機制了。
在往用戶表里新增一條數據時,獲取‘用戶ID’:
?
UPDATE ticket_mutexSET value=LAST_INSERT_ID(value+1)WHERE name='USER';SELECT LAST_INSERT_ID();
+------------------+
|
LAST_INSERT_ID() |
+------------------+
|
1 |
+------------------+
通過這條語句之后,我們得到結果為1,這個值就是我們所需要的值。再來查看數據記錄,我們發現記錄總數沒有改變,但是‘用戶’的ID已經為1了;
?
+------+-------+
|name |
value |
+------+-------+
|
POST | 0 |
|USER |
1 |
+------+-------+
同樣的方法,我們可獲取‘主題’的ID:
?
UPDATE ticket_mutexSET value=LAST_INSERT_ID(value+1)WHERE name='POST';SELECT LAST_INSERT_ID();
+------------------+
|
LAST_INSERT_ID() |
+------------------+
|
1 |
+------------------+
查看所有的記錄:
?
+------+-------+
|name |
value |
+------+-------+
|
POST | 1 |
|USER |
1 |
+------+-------+

從上可以看出,通過MySQL的LAST_INSERT_ID機制,我們可以保證在記錄總數不增長的情況下,讓業務ID在不斷的增加,從而保證了分表ID的唯一性。

4、LAST_INSERT_ID說明
從名字可以看出,LAST_INSERT_ID即為最后插入的ID值,根據MySQL的官方手冊說明,它有2種使用方法
一是不帶參數:LAST_INSERT_ID(),這種方法和AUTO_INCREMENT屬性一起使用,當往帶有‘AUTO_INCREMENT’屬性字段的表中新增記錄時,LAST_INSERT_ID()即返回該字段的值,大家可試下(我已經驗證過);
二是帶有表達式:如上面介紹的LAST_INSERT_ID(value+1),它返回的是表達式的值,即‘value+1’;



總結:LAST_INSERT_ID()返回最后一個INSERT或UPDATE語句中AUTO_INCREMENT列的值。

 

本文轉自:http://blog.csdn.net/crazyhacking/article/details/9945529


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM