登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: [mysql/mssql/sql server]怎么知道刚刚insert进去的记录的ID     [回主站]     [分站链接]
标题
[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

编辑删除



总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1