标题
[mysql/mssql/sql server]怎么知道刚刚insert进去的记录的ID
clq
浏览(0) +
2009-08-14 09:47:00 发表
编辑
关键字:
CSDN-CSDN社区-其他数据库开发-MySQL/Postgresql
收藏 [推荐] 怎么知道刚刚insert进去的记录的ID[问题点数:20分]
*
* csdn1111
* (啊啊啊)
*
* 等 级:
* 结帖率:98.08%
*
楼主发表于:2009-08-13 08:52:51
create t1 (id bigint NOT NULL AUTO_INCREMENT, v varchar(100))
insert into t1 (v) values('sss')
怎么知道刚刚insert进去的记录的ID
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
回复次数:41
* nianzhang747用户头像
* nianzhang747
* (飓风)
*
* 等 级:
*
#1楼 得分:0回复于:2009-08-13 09:20:38
select last_insert_id();
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
精华推荐:SSAS求加权平均
* nianzhang747用户头像
* nianzhang747
* (飓风)
*
* 等 级:
*
#2楼 得分:0回复于:2009-08-13 09:21:36
show table status where Name="t1";
这个结果集的auto_increment 字段就是你要的id
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
精华推荐:求SSAS中的计算成员中属性成员的使用
* nianzhang747用户头像
* nianzhang747
* (飓风)
*
* 等 级:
*
#3楼 得分:0回复于:2009-08-13 09:22:36
一般这种情况 select max(id) from t1;
当你表中记录为空的时候是获取不到的
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
精华推荐:MySQL--- FAQ(2008-10-30更新)
* wfnychuan用户头像
* wfnychuan
* (wfnychuan)
*
* 等 级:
*
#4楼 得分:0回复于:2009-08-13 09:23:03
SQL code
select last_insert_id()
确实可以。
不过如果你是在insert into时如果id是自己指定的话。这里select last_insert_id()就会得到0
也就是说id要自动插入的才可以得到last_insert_id()
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
精华推荐:用C#/.NET挑战一下VFP
* wfnychuan用户头像
* wfnychuan
* (wfnychuan)
*
* 等 级:
*
#5楼 得分:0回复于:2009-08-13 09:32:21
SQL code
->insert into t5(name) values('chuan'),('test'),('an'); ->select last_insert_id();
还有个问题就是如果insert into是用类似上面的格式多条记录同时插入。没插入之前id为10 插入三条记录后id为13
可是这select last_insert_id();却只能得到11而不是13
因为假如你使用一条INSERT语句插入多个行, LAST_INSERT_ID() 只返回插入的第一行数据时产生的值。
所以个人觉得还是用select max(id) from table_name 比较保险,毕竟id是auto_increment的。
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
精华推荐:MDX 如何 翻译 转换 为 SQL 脚本
* vinsonshen用户头像
* vinsonshen
* (学路,没有尽头的!)
*
* 等 级:
*
#6楼 得分:0回复于:2009-08-13 10:01:23
多行同时插入时,用last_insert_id()只能取到此次插入的第一条记录的auto_increment值
最好从系统表里面取:
select auto_increment from information_schema.tables where table_schema='db_csdn' and table_name='tb_test_auto'
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* vinsonshen用户头像
* vinsonshen
* (学路,没有尽头的!)
*
* 等 级:
*
#7楼 得分:0回复于:2009-08-13 10:01:49
SQL code
select auto_increment from information_schema.tables where table_schema='库名' and table_name='表名'
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* ckc用户头像
* ckc
* (火)
*
* 等 级:
*
#8楼 得分:0回复于:2009-08-13 11:09:35
select max(id) from table_name
只有在数据库是一个人操作的时候才正确,如果在你插入之后又有别人插入了
查询到的结果是错误的
还是用last_insert_id比如好
你在这种情况下完全可以不用多行插入
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* phf0313用户头像
* phf0313
* (凮畃)
*
* 等 级:
*
#9楼 得分:0回复于:2009-08-13 12:22:44
不好意思,只知道mssql的方法。
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* csdn1111用户头像
* csdn1111
* (啊啊啊)
*
* 等 级:
*
#10楼 得分:0回复于:2009-08-13 12:39:50
引用 1 楼 nianzhang747 的回复:
select last_insert_id();
这个根本不行,
你没有考虑到并发
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* cjj2003用户头像
* cjj2003
* (cjj2003)
*
* 等 级:
*
#11楼 得分:0回复于:2009-08-13 12:55:03
学习了学习了学习了
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* huohongyan用户头像
* huohongyan
* (huohongyan)
*
* 等 级:
*
#12楼 得分:0回复于:2009-08-13 12:56:37
select @@IDENTITY
得到的就是最后插入的ID
不过我感觉设计的时候最后不要设计成这个样子,
还是通过一个专门的表来管理这些字段比较好。
比如加一个“番号表”
表中存储了当前最大的ID,
插入之前去这个表中取ID+1
来使用,并更新这个最大ID,这样更方便一些。
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* csdn1111用户头像
* csdn1111
* (啊啊啊)
*
* 等 级:
*
#13楼 得分:0回复于:2009-08-13 13:00:00
引用 12 楼 huohongyan 的回复:
select @@IDENTITY
得到的就是最后插入的ID
不过我感觉设计的时候最后不要设计成这个样子,
还是通过一个专门的表来管理这些字段比较好。
比如加一个“番号表”
表中存储了当前最大的ID,
插入之前去这个表中取ID+1
来使用,并更新这个最大ID,这样更方便一些。
这个根本也不行,
你没有考虑到并发
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* yueliangdao0608用户头像
* yueliangdao0608
* (我喜欢上帝,尤其是他老婆。)
*
* 等 级:
*
4
7
3
#14楼 得分:0回复于:2009-08-13 13:02:10
引用 4 楼 wfnychuan 的回复:
SQL codeselect last_insert_id()
确实可以。
不过如果你是在insert into时如果id是自己指定的话。这里select last_insert_id()就会得到0
也就是说id要自动插入的才可以得到last_insert_id()
自己指定的话,你还要自增ID干嘛用呢?
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* swetter_hundsun用户头像
* swetter_hundsun
* (阿信)
*
* 等 级:
*
#15楼 得分:0回复于:2009-08-13 13:20:49
学习中...
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* Jeffrey84用户头像
* Jeffrey84
* (福福|hi~)
*
* 等 级:
*
#16楼 得分:0回复于:2009-08-13 13:40:42
SQL server
SQL code
SELECT ID = scope_identity();
获得当前会话的自动增长的ID,不会有并发问题
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* jrl5365用户头像
* jrl5365
* (king007)
*
* 等 级:
*
#17楼 得分:0回复于:2009-08-13 13:55:49
select @@IDENTITY
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* wptad用户头像
* wptad
* (Tad)
*
* 等 级:
*
#18楼 得分:0回复于:2009-08-13 13:57:43
插入后,用 @@Identity 取值
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* wptad用户头像
* wptad
* (Tad)
*
* 等 级:
*
#19楼 得分:0回复于:2009-08-13 13:58:08
C# code
RETURN @@Identity
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* lingxizhixia用户头像
* lingxizhixia
* (凌欷至瑕)
*
* 等 级:
*
#20楼 得分:0回复于:2009-08-13 14:16:01
使用触发器
MYSQL是在5.0以后的版本中引入触发器的。
CREATE TRIGGER <触发器名称> <--
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON <表名称>
FOR EACH ROW
<触发器SQL语句>
触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.
触发时间:
Before表示在事件发生之前执行触发器,After表示在事件发生之后执行触发器;
触发事件:
三个事件:insert, update, delete
触发器与表的关系:
触发器是属于一个表的,当在这个表上执行insert, update, delete操作时,就会导致相应的触发器被激活;
不能给同一个表的同一个操作创建两个不同的触发器。
触发间隔:
FOR EACH ROW 子句通知触发器每隔一行执行一次动作,而不是对整下表执行一次。
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* jichunxu用户头像
* jichunxu
* (jichunxu)
*
* 等 级:
*
#21楼 得分:0回复于:2009-08-13 14:37:05
insert into t1 (v) values('sss')
把这个表增加一个字段,时间字段,这个字段插入 当前时间的字符串,这个是唯一的 既
Long.toString(new Date().getTime());
然后你在根绝这个字符串查找对应的id
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* trainee用户头像
* trainee
* (春泥)
*
* 等 级:
*
#22楼 得分:0回复于:2009-08-13 15:08:02
引用
怎么知道刚刚insert进去的记录的ID
引用 10 楼 csdn1111 的回复:
引用 1 楼 nianzhang747 的回复:
select last_insert_id();
这个根本不行,
你没有考虑到并发
你的这2个提问是自相矛盾的
如果你要考虑到并发,应该这样提问:
"怎么知道当前最后一个insert进去的记录的ID"
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* qgylovelj用户头像
* qgylovelj
* (qgylovelj)
*
* 等 级:
*
#23楼 得分:0回复于:2009-08-13 15:23:18
jf
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* obullxl用户头像
* obullxl
* (老牛啊)
*
* 等 级:
*
#24楼 得分:0回复于:2009-08-13 15:45:50
如果不用auto_increment就好了,也不用这么麻烦了.
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* fengylm用户头像
* fengylm
* (CHINA*范)
*
* 等 级:
*
#25楼 得分:0回复于:2009-08-13 15:50:32
select @@identity
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* csdn1111用户头像
* csdn1111
* (啊啊啊)
*
* 等 级:
*
#26楼 得分:0回复于:2009-08-13 16:04:05
引用 22 楼 trainee 的回复:
引用
怎么知道刚刚insert进去的记录的ID
引用 10 楼 csdn1111 的回复:
引用 1 楼 nianzhang747 的回复:
select last_insert_id();
这个根本不行,
你没有考虑到并发
你的这2个提问是自相矛盾的
如果你要考虑到并发,应该这样提问:
"怎么知道当前最后一个insert进去的记录的ID"
这还需要解释,
谁都知道MAX(ID)完了,这么简单谁还问!@@!
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* godfrey1108用户头像
* godfrey1108
* (十万个为什么)
*
* 等 级:
*
#27楼 得分:0回复于:2009-08-13 16:23:08
select id from t1 where v='sss';
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* ACMAIN_CHM用户头像
* ACMAIN_CHM
* (acmain)
*
* 等 级:
*
2
7
#28楼 得分:0回复于:2009-08-13 16:59:19
SQL code
mysql> create table t_csdn1111(id int auto_increment primary key, v char(10)); Query OK, 0 rows affected (0.13 sec) mysql> insert into t_csdn1111(v) values ('A1'); Query OK, 1 row affected (0.06 sec) mysql> select last_insert_id(); +------------------+ | last_insert_id() | +------------------+ | 1 | +------------------+ 1 row in set (0.00 sec) mysql> select * from t_csdn1111 where id is null; +----+------+ | id | v | +----+------+ | 1 | A1 | +----+------+ 1 row in set (0.00 sec) mysql> select auto_increment from information_schema.tables where table_schema=' csdn' and table_name='t_csdn1111'; +----------------+ | auto_increment | +----------------+ | 2 | +----------------+ 1 row in set (0.08 sec) mysql> mysql> insert into t_csdn1111(v) values ('A21'),('A22'),('A23'); Query OK, 3 rows affected (0.06 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select last_insert_id(); +------------------+ | last_insert_id() | +------------------+ | 2 | +------------------+ 1 row in set (0.00 sec) mysql> select * from t_csdn1111 where id is null; +----+------+ | id | v | +----+------+ | 2 | A21 | +----+------+ 1 row in set (0.00 sec) mysql> select auto_increment from information_schema.tables where table_schema=' csdn' and table_name='t_csdn1111'; +----------------+ | auto_increment | +----------------+ | 5 | +----------------+ 1 row in set (0.00 sec) mysql>
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* myshinji用户头像
* myshinji
* (自由的飞)
*
* 等 级:
*
#29楼 得分:0回复于:2009-08-13 17:07:35
呵呵,的确,有时候只需要知道刚刚插入的数据的id的值,(如果ID值不是自己指定的话)
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* wuhuan0428用户头像
* wuhuan0428
* (wuhuan0428)
*
* 等 级:
*
#30楼 得分:0回复于:2009-08-13 18:11:38
学习中 厉害
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* kemushui用户头像
* kemushui
* (kemushui)
*
* 等 级:
*
#31楼 得分:0回复于:2009-08-13 18:48:50
学习在学习
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* HelloHT用户头像
* HelloHT
* (HelloHT)
*
* 等 级:
*
#32楼 得分:0回复于:2009-08-13 19:31:09
学习一下
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* lvsss576用户头像
* lvsss576
* (lvsss576)
*
* 等 级:
*
#33楼 得分:0回复于:2009-08-13 19:53:02
该回复于2009-08-13 23:29:56被管理员删除
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* tp4479用户头像
* tp4479
*
*
* 等 级:
*
#34楼 得分:0回复于:2009-08-13 20:02:44
可以查下文档....
感觉SCOPE_IDENTITY()比较像些。
IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。
@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* zhaoqiliang527用户头像
* zhaoqiliang527
* (人在天涯)
*
* 等 级:
*
#35楼 得分:0回复于:2009-08-13 20:21:40
函数如下:两个sql 语句空格连起来就可以了。
public int InsertSubjectreturn(string Sub_Name, string Sub_Note, string insertname)
{
string strsql = "insert into KSXT_subject(Sub_Name,Sub_Note,insertname) values ('" + Sub_Name + "','" + Sub_Note + "','" + insertname + "') select @@IDENTITY as insertid ";
DBAccess mydb = new DBAccess();
return(Convert.ToInt32( mydb.ExecuteScalar(strsql)));
}
调用如下:
Subject mysub = new Subject();
int a= mysub.InsertSubjectreturn ("计算机文化基础", "2008级通修", "郝永生");
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* zyb134506用户头像
* zyb134506
* (zyb134506)
*
* 等 级:
*
#36楼 得分:0回复于:2009-08-13 22:08:22
自动增长的ID啊,你存入数据的时候保留一个存入数据的信息,然后根据这个信息(最好是主键|很难重复的)查找最大ID。
SQL code
SELECT MAX(ID) FROM T1 WHERE V=?;
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* Hywin1020用户头像
* Hywin1020
* (Hywin1020)
*
* 等 级:
*
#37楼 得分:0回复于:2009-08-13 22:48:55
查找最大的是不对的。
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* taksunm用户头像
* taksunm
* (admin)
*
* 等 级:
*
#38楼 得分:0回复于:2009-08-14 09:05:55
xx
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* haonanxxx用户头像
* haonanxxx
* (浩南.Chen)
*
* 等 级:
*
#39楼 得分:0回复于:2009-08-14 09:14:20
执行存储过程返回@@identity.可以保证不错,
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* trainee用户头像
* trainee
* (春泥)
*
* 等 级:
*
#40楼 得分:0回复于:2009-08-14 09:36:41
last_insert_id()和@@identity. 都是一样的, @@identity是后来为了兼容MSSQL补上的.
这些值都是基于本连接的,本连接最近的一次AUTO_INCREMENT值
如果你要查最新的值,假如有并发操作的话,那就SELECT MAX(ID) FROM XXXX, 如果要严格的话前面需加个锁
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* jiangjf0407用户头像
* jiangjf0407
* (jiangjf0407)
*
* 等 级:
*
#41楼 得分:0回复于:2009-08-14 09:42:00
jdbc返回主键id,该id是一个自增长的字段
//返回主键自动
PreparedStatement pre=conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
pre.executeUpdate();
ResultSet rs = pre.getGeneratedKeys();
int m=0;
if(rs.next()){
m=rs.getInt(1);
}
* 对我有用[0]
* 丢个板砖[0]
* 引用
* 举报
* 管理
* TOP
* 管理菜单
o 生成帖子
o 置顶
o 推荐
o 取消推荐
o 锁定
o 解锁
o 移动
o 编辑
o 删除
o 帖子加分
* 结 帖
* 发 帖
* 回 复
相关问题
C#+Mysql 返回刚刚执行的insert ID的值
为了取到刚刚生成的记录的Id,而对表进行加锁的问题Java / Web 开发 ...
怎样取得当前insert的数据...... Web 开发/ ASP - CSDN社区community ...
如果INSERT 数据进去还可以同时返回ID 因为ID是自动增加的.NET技术/ C# ...
增加到数据库中后,如何得到新增加的记录的自动编号的值? Web 开发 ...
怎么把记录提交到数据库? Web 开发/ PHP - CSDN社区community.csdn.net
公司简介| 广告服务| 银行汇款帐号| 联系方式| 版权声明| 问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
文明办网文明上网举报电话:13552009689
Copyright © 1999-2009, CSDN.NET, All Rights Reserved
GongshangLogo
编辑删除
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.