转: MYSQL获取更新行的主键ID
在某些情况下我们需要向数据表中更新一条记录的状态,然后再把它取出来,但这时如果你在更新前并没有一个确认惟一记录的主键就没有办法知道哪条记录被更新了。
举例说明下:
有一个发放新手卡的程序,设计数据库时常见的方案有两种:
方案一:使用一张表,新手卡和领取记录都在一起,这样主要字段就是新手卡(主键)、用户ID(惟一)、领取状态(非必要)等
这样的话数据库操作就简单了,直接一条update sql,将用户id更新到这张表里,然后根据用户ID再select出来就好了。但这样记录很多时就会有效率的问题,暂不讨论。
方案二:使用两张表,一张存放新手卡,另外一张存放领取记录。新手卡表里面有新手卡(主键)、新手卡状态等字段。
在操作时也可以有两种方式:
一是先从新手卡表中select出一条记录,然后去更新它的状态,再之后插入到领取记录表中。
但这种方式最大的问题在于高并发情况下,会出现多个用户select出了同一条记录,这样就只能有一个人成功,其他人会失败。
二是先从新手卡中更新一条记录,然后取出这条记录插入到领取记录表中。由于是先update再select所以很好适应高并发的情况,
但是现在就遇到前面说的问题了:怎样获取刚才更新记录的ID呢?
下面代码是从stackoverflow上找到的答案,借用一下:
SET @update_id := 0;
UPDATE some_table SET row = 'value', id = (SELECT @update_id := id)
WHERE some_other_row = 'blah' LIMIT 1;
SELECT @update_id;
大致思路就是首先声明一个用户变量 @update_id ,之后在update数据时要多更新一个字段,就是将当前主键值更新为当前主键值(其实就是没更新),更新主键字段并不是目的,只是为了将当前主键值赋值给@update_id,就是这句: ( SELECT @update_id := id )。 (个人理解,水平有限可能会有出入)
另外如果更新了多条记录也可以用下面的方式
SET @uids := null;
UPDATE footable
SET foo = 'bar'
WHERE fooid > 5
AND ( SELECT @uids := CONCAT_WS(',', fooid, @uids) );
SELECT @uids;
注:上面的方法不适用于有HAVING、GROUP BY或者ORDER BY子句中,否则可能出入与预期不同的结果。
参考官方手册说明 http://dev.mysql.com/doc/refman/5.1/zh/language-structure.html
转自:http://blog.csdn.net/rainday0310/article/details/25037295
stackoverflow问题:
http://stackoverflow.com/questions/1388025/how-to-get-id-of-the-last-updated-row-in-mysql
mysql last_insert_id
Mysql函数可以实现许多我们需要的功能,下面介绍的Mysql函数Last_insert_id()就是其中之一,希望对您学习Mysql函数能有所帮助。
=常用用法=============================================
若给出作为到LAST_INSERT_ID()的参数expr ,则参数的值被函数返回,并作为被LAST_INSERT_ID()返回的下一个值而被记忆。这可用于模拟序列:
创建一个表,用来控制顺序计数器并使其初始化:
mysql> CREATE TABLE sequence (id INT NOT NULL);
mysql> INSERT INTO sequence VALUES (0);
使用该表产生这样的序列数 :
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);
mysql> SELECT LAST_INSERT_ID();
->1;
UPDATE 语句会增加顺序计数器并引发向LAST_INSERT_ID() 的下一次调用,用来返回升级后的值。 SELECT 语句会检索这个值。 mysql_insert_id() C API函数也可用于获取这个值。
你可以不用调用LAST_INSERT_ID()而产生序列,但这样使用这个函数的效用在于 ID值被保存在服务器中,作为自动产生的值。它适用于多个用户,原因是多个用户均可使用 UPDATE语句并用SELECT语句(或mysql_insert_id()),得到他们自己的序列值,而不会影响其它产生他们自己的序列值的客户端或被其它产生他们自己的序列值的客户端所影响。
注意, mysql_insert_id() 仅会在INSERT 和UPDATE语句后面被升级, 因此你不能在执行了其它诸如SELECT或 SET 这样的SQL语句后使用 C API 函数来找回 LAST_INSERT_ID(expr) 对应的值。
转: MYSQL获取更新行的主键ID的更多相关文章
- MYSQL获取更新行的主键ID 【转】
在某些情况下我们需要向数据表中更新一条记录的状态,然后再把它取出来,但这时如果你在更新前并没有一个确认惟一记录的主键就没有办法知道哪条记录被更新了. 举例说明下: 有一个发放新手卡的程序,设计数据库时 ...
- Mybatis 在 insert 之后想获取自增的主键 id
记录一次傻逼的问题, 自己把自己蠢哭:Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1 错误说明: 返回的1是影响的行数,并不是自增的主键id: 想要获取自增主键id,需要 ...
- Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1
记录一次傻逼的问题, 自己把自己蠢哭:Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1 错误说明: 返回的1是影响的行数,并不是自增的主键id: 想要获取自增主键id,需要 ...
- PHP获取新插入的主键id
近期在做订单系统开发的时候遇到了此类情景,A表内插入后返回新插入的主键ID,然后用于B表插入数据并携带此id. 目前有几个方法总结 No1.每次插入数据之后返回A表内的最大值,但是对于多用户以及高并发 ...
- MySQL 获取物理表的主键字段
参考代码: /** * 获取主键字段 * @param $table * @param $database * @return mixed */ public function get_primary ...
- spring jdbc获取插入记录的主键id
在JDBC3.0规范中,当新增记录时,允许将数据库自动产生的主键值绑定到Statement或PreparedStatement中.使用Statement时,可以通过以下方法绑定主键值: int exe ...
- myBatis获取批量插入数据的主键id
在myBatis中获取刚刚插入的数据的主键id是比较容易的 , 一般来说下面的一句话就可以搞定了 , 网上也有很多相关资料去查. @Options(useGeneratedKeys = true, k ...
- Laravel 5 插入数据后返回主键ID
方法一: $info = DB::table('表名')->insertGetId(['imgName' => $fileName]);//图片名入库后返回添加数据行的主键ID 方法二:( ...
- Mybatis中insert返回主键ID
记录解决的过程,这里就不搬砖了. 1.获取insert后的主键id 原文链接:http://www.cnblogs.com/fsjohnhuang/p/4078659.html 2.insert后返回 ...
随机推荐
- Python Scrapy 验证码登录处理
一.Form表单分析 以豆瓣登录页面为例分析,豆瓣登录页是:https://accounts.douban.com/login,浏览器打开之后查看源码,查找登录的form表单HTML结构.如下: 包括 ...
- GSAP 官方文档(结贴)
好久没写GSAP的教程的(其实我也不懂哈哈),国内也没什么人用,不对动画要求特别高的话,其实也没必要用GSAP,现在工作上没用到这个东西,也懒得写了,所以有问题的话去找一下greensock的官方文档 ...
- Integer.parseInt()和Integer.valueOf()方法详解
1.Integer.parseInt(): public static int parseInt(String s) throws NumberFormatException { return par ...
- java解析xml字符串(用dom4j)
package com.smsServer.Dhst; import java.util.HashMap; import java.util.Iterator; import java.util.Ma ...
- PHP 开发环境的搭建和使用03-- 安装mySql
1/ 安装的MySQL版本是5.6.10版本的,直接点击Install 2/ 选择 Execute 3/ 更新最新版本成功后,选择 "next" 4/ 自定义安装方式,选择C ...
- JS内存泄漏排查方法-Chrome Profiles
原文链接:http://caibaojian.com/chrome-profiles.html 一.概述 Google Chrome浏览器提供了非常强大的JS调试工具,Heap Profiling便是 ...
- dreamweaver中Dw设置svn进行版本控制
需要工具: VisualSVN dwcs5+ 点击查看教程
- 160314、MVC设计模式
MVC的由来 精彩内容 MVC模式最早由Trygve Reenskaug在1978年提出 ,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件设 ...
- Hibernate的映射组成关系
建立域模型(Java的对象模型)和关系数据模型(数据库表模型)有着不同的出发点: 域模型: 由程序代码组成, 通过细化持久化类的的粒度(就是通过把相同的属性,规划为一个类)可提高代码的可重用性, 简化 ...
- hibernate的日期映射
2. 映射 Java 的时间, 日期类型 1). 两个基础知识: I. 在 Java 中, 代表时间和日期的类型包括: java.util.Date 和 java.util.Calendar. 此外, ...