日期:2014-05-18  浏览次数:20769 次

求一条sql语句
现在我想通过一条sql语句,先将数据插入数据库然后马上得到刚添加进去的id值(id自增),急急急.......

------解决方案--------------------
在建表的时候ID字段就可以设置成自动递加一的啊!不管是ACCESS,SQL Server MySQL都可以实现的.
------解决方案--------------------
mysql:
SELECT LAST_INSERT_ID();
sqlserver:
SELECT @@IDENTITY

------解决方案--------------------
自动增加就行了 在建表的时候ID字段就可以设置成自动递加一的啊!不管是ACCESS,SQL Server MySQL都可以实现的.
oracel的话 只要先建立一个seq然后插入的时候调用就ok了
------解决方案--------------------
lyazure(Cloe) ( )
mysql:
SELECT LAST_INSERT_ID();
sqlserver:
SELECT @@IDENTITY
==============================
lyazure(Cloe) 仁兄说的如果存在并发,是不安全的,不能保证是你刚插入的ID

楼主可以把你的业务描述一下,或许大家有好的办法帮你解决。
------解决方案--------------------
好像要用两条语句
先 insert 插入,再select sequence.nextval from dual 从序列中查下一值
------解决方案--------------------
先获得最大id数,加1后再插入数据库
就ok了
------解决方案--------------------
在Oracle中一般的这样取就行了:序列名.nextval;其中序列要先创建。
------解决方案--------------------
首先要获得的ID号字段要是int型的自增字段
比如create table TEST(
ID int identity,
a varchar(20)
)

在SQL SERVER里面定义过程
create proc test @a varchar(20),@id int output
as
...(插入数据的语句)
SET @id = SCOPE_IDENTITY()
...
这样就可得到当前插入的行的ID,这里必须用SCOPE_IDENTITY()而不能用@@IDENTITY.因为:
SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域


在程序里面用一个CallableStatement cstmt = conn.prepareCall( "{call test(?,?)} ");
(如何获得Connection对象conn这里就不写了)
cstmt.setString(1, "测试字符串 ");
cstmt.registerOutParameter(2,java.sql.Types.INTEGER);(我们要的是第二个参数传回的值,这里注册一下哪个参数是可以传回数据的,类型要对应存储过程test的参数类型和顺序)
cstmt.execute();
int myId = cstmt.getInt(2);(这里同样指定是第二个参数为返回值)

这样myId 就是当前插入到数据库的那一行的id号.
------解决方案--------------------
Select max(id) from Table_ ;
------解决方案--------------------
八戒的最简单哈,不过用种方法检索很容易出错呵
------解决方案--------------------
insert into t values( 'a ')
select top 1 id from t order by desc