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表'; |
字段‘value’即該業務的ID值。
2、初始化業務和其ID值
?
| INSERT?INTO?ticket_mutex(name, value) values('USER', 0),('POST', 0); +------+-------+ |name?| value | +------+-------+ | POST |???? 0 | |USER?|???? 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 | +------------------+ |
?
| +------+-------+ |name?| value | +------+-------+ | POST |???? 0 | |USER?|???? 1 | +------+-------+ |
?
| 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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Delphi 自带的 Base64 编解
- 下一篇: s:iterator标签的使用