日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL的mysql_insert_id和LAST_INSERT_ID

發布時間:2023/11/30 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL的mysql_insert_id和LAST_INSERT_ID 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘要:mysql_insert_id和LAST_INSERT_ID二者作用一樣,均是返回最后插入值的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","","database") or die("數據庫連接超時!");

$sql = "insert into tableA(name,url) values('老吧博客','http://www.lao8.org')";

$result = $conn->query($sql) or die("失敗");

echo mysqli_insert_id($conn); //輸出剛剛插入數據的ID,注意:括號里面的要是$conn而不是$resu



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) ? 總結:LAST_INSERT_ID()返回最后一個INSERT或UPDATE語句中AUTO_INCREMENT列的值。

2 ?

使用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值。

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’;
轉載:http://www.cnblogs.com/obullxl/archive/2011/06/24/mysql-last-insert-id.html

轉載于:https://www.cnblogs.com/catkins/p/5270600.html

總結

以上是生活随笔為你收集整理的MySQL的mysql_insert_id和LAST_INSERT_ID的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。