MYSQL中获取得最后一条记录的语句

方法1:select max(id) from tablename

方法2:select last_insert_id();

在MySQL中,使用auto_increment类型的id字段作为表的主键,并用它作为其他表的外键,形成“主从表结构”,这是数据库设计中 常见的用法。但是在具体生成id的时候,我们的操作顺序一般是:先在主表中插入记录,然后获得自动生成的id,以它为基础插入从表的记录。这里面有个困 难,就是插入主表记录后,如何获得它对应的id。通常的做法,是通过“select max(id) from tablename”的做法,但是显然这种做法需要考虑并发的情况,需要在事务中对主表加以“X锁“,待获得max(id)的值以后,再解锁。这种做法需 要的步骤比较多,有些麻烦,而且并发性也不好。有没有更简单的做法呢?答案之一是通过select LAST_INSERT_ID()这个操作。乍一看,它和select max(id)很象,但实际上它是线程安全的。也就是说它是具体于数据库连接的。下面通过实验说明:

  1、在连接1中向A表插入一条记录,A表包含一个auto_increment类型的字段。

  2、在连接2中向A表再插入一条记录。

  3、结果:在连接1中执行select LAST_INSERT_ID()得到的结果和连接2中执行select LAST_INSERT_ID()的结果是不同的;而在两个连接中执行select max(id)的结果是相同的。

其实在MSSQL中SCOPE_IDENTITY()和IDENT_CURRENT()的区别和这里是类似的。使用SCOPE_IDENTITY()可以
获得插入某个IDENTITY字段的当前会话的值,而使用IDENT_CURRENT()会获得在某个IDENTITY字段上插入的最大值,而不区分不同
的会话。

  注:使用select last_insert_id()时要注意,当一次插入多条记录时,只是获得第一次插入的id值,务必注意!可以试试

  insert into tb(c1,c2) values (c1value,c2value),(c1value1,c2value2)..。

时间: 2024-12-29 10:55:23

MYSQL中获取得最后一条记录的语句的相关文章

hibernate 中根据id删除一条记录的语句

qid name like content 1 A 1 the first text 2 B 2 the Second text 1 C 3 the Third text 如上表所示,当我们需要某个qid执行删除操作时,可以按照如下语句进行执行 1 String hql="from bbsLikes b where b.qid=(:ID)"; 2 String[] paramName={"ID"}; 3 Object[] value={qid}; 5 List li

一张表里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把mysql重启,再insert一条记录,这条记录的ID是18还是15 ?

转:https://blog.csdn.net/xzp_12345/article/details/79458586 一般情况下,我们创建的表的类型是InnoDB,如果新增一条记录(不重启mysql的情况下),这条记录的id是18:但是如果重启(文中提到的)MySQL的话,这条记录的ID是15.因为InnoDB表只把自增主键的最大ID记录到内存中,所以重启数据库或者对表OPTIMIZE操作,都会使最大ID丢失. 但是,如果我们使用表的类型是MylSAM,那么这条记录的ID就是18.因为MylSA

MySQL每个分类的前几条记录

MySQL 获取所有分类和每个分类的前几条记录 比如有文章表 Article(Id,Category,InsertDate) 现在要用SQL找出每种类型中时间最新的前N个数据组成的集合 SELECT A1.* FROM Article AS A1 INNER JOIN (SELECT A.Category,A.InsertDate FROM Article AS A LEFT JOIN Article AS B ON A.Category = B.Category AND A.InsertDat

mysql中获取一天、一周、一月时间数据的各种sql语句写法

今天抽时间整理了一篇mysql中与天.周.月有关的时间数据的sql语句的各种写法,部分是收集资料,全部手工整理,自己学习的同时,分享给大家,并首先默认创建一个表.插入2条数据,便于部分数据的测试,其中部分名词或函数进行了解释说明.直入主题! 创建表:create table if not exists t(   id int,   addTime datetime default ’0000-00-00 00:00:00′)添加两条初始数据:insert t values(1, ’2012-07

mysql中查询值为NULL的记录

例如表A中的user_login_name的值为NULL,用mysql语句把这条记录查询出来,用select user_login_name from A where user_login_name is null 注意使用关键词is null

mysql中获取时间的函数

今天做项目,有一个获取七天前日期的数据的一个需求.然后就百度mysql中关于时间的函数.收集了一些.现记录如下: 参考地址:http://www.w3school.com.cn/sql/sql_dates.asp -- 获取当前时间SELECT NOW() SELECT CURDATE()SELECT CURRENT_DATE()SELECT CURRENT_TIME()SELECT CURRENT_TIMESTAMP()SELECT CURTIME() -- DATE_SUB() 函数从日期减

[MySQL] 分组排序取前N条记录以及生成自动数字序列,类似group by后 limit

前言:         同事的业务场景是,按照cid.author分组,再按照id倒叙,取出前2条记录出来.        oracle里面可以通过row_number() OVER (PARTITION BY cid,author ORDER BY id DESC) 表示根据cid,author分组,在分组内部根据id排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的),而mysql数据库就没有这样的统计函数,需要自己写复杂的sql来实现. 1,录入测试数据 USE csd

取得left join的第二表中符合条件的第一条记录

问题描述 有表一 tableA tid     username     title 1         lily       我公司将进行xx培训 2        angus      关于秋游的通知 3        boss       这个月不发奖金 4        vivi       新产品上市 表二 tableB tid      time     txt 1        0809    大家快来.... 2        0810    我是新来的,大家好 2       

MySQL分组排序取前N条记录以及生成自动数字序列--group by 后 limit 外加 rownumber

同事提了一个需求,要求按照某列分组,然后将各组的前几条抽取出来. 表结构 CREATE TABLE `total_freq_ctrl` ( `time` int(10) unsigned NOT NULL, `machine` char(64) NOT NULL, `module` char(32) NOT NULL, `total_flow` int(10) unsigned NOT NULL, `deny_flow` int(10) unsigned NOT NULL, PRIMARY KE