在SQLServer/MySQL数据库中如何取得刚插入的标识值

 

在SQLServer/MySQL数据库中如何取得刚插入的标识值

在SQLServer数据库中

数据库实际应用中,我们往往需要得到刚刚插入 的标志值来往相关表中写入数据。但我们平常得到的真的是我们需要的那个值么?
(1)、有时我们会使用 SELECT @@Identity 来获得我们刚刚插入的值,比如下面的代码

代码一:
use tempdb
if exists (select * from sys.objects where object_id = object_id(N'[test1]') and type in (N'u'))
drop table [test1]
go
create table test1
(
id int identity(1,1),
content nvarchar(100)
)
insert into test1 (content) values ('solorez')
select @@identity

乐观情况下,这样做是没问题的,但如果我们如果先运行下面的代码二创建一个触发器、再运行代码三:

代码二:
create table test2
(
id int identity(100,1),
content nvarchar(100)
)

create trigger tri_test1_identitytest_I
on test1 after insert
as
begin
insert into test2
select content from inserted
end

代码三:
insert into test1 (content) values ('solorez2')
select @@identity
 
我们可以看到,此时得到的标识值已经是100多了,很明显,这是表test2的生成的标识值,已经不是我们想要的 了。
我们可以看看@@identity的定义:Identity
原来,@@identity返回的是当前事务最后插入的标识值,因为在Insert Test1表执行后,紧接着触发了触发器又Insert Test2表,所以,这时候@@identity的值就是表test2的生成的标识值。

(2)、这 时我们或许会用下面的方法:

代码四:
insert into test1 (content) values ('solorez3')
SELECT IDENT_CURRENT('test1')

看来结果还比较正确,但如果我们在多次运行代码四的同时运行下面的代码五:

代码五:
insert into test1 (content) values ('solorez3')

waitfor delay '00:00:20'
SELECT IDENT_CURRENT('test1')
 
结果又 不是我们想要的了!
再看看IDENT_CURRENT(Tablename) 的定义:IDENT_CURRENT(Tablename)
是 返回指定表的最后标识值。

(3)、到这里,是该亮出答案的时候了,我们可以使用下面的代码:

代码六:
insert into test1 (content) values ('solorez3')
SELECT scope_identity()

这时,我们无论是添加触发器还是运行并行插入,得到的始终是当前事务的标识值。

scope_identity()的定义:scope_identity()返回为当前会话和当前作用域中的某个表生成的最新标识值

 

三个函数的区别:

IDENT_CURRENT 返回为某个会话和用域中的指定表生成的最新标识值。

@@IDENTITY 返回为跨所有作用域的当前会话中的某个表生成的最新标识值。

SCOPE_IDENTITY 返回为当前会话和当前作用域中的某个表生成的最新标识值。

 

 

在MySQL数据库中

一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。

但在多线程情况下,就不行了。

下面介绍三种方法

(1)   getGeneratedKeys()方法:

(2)LAST_INSERT_ID:

LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。

在多用户交替插入数据的情况下max(id)显然不能用。

这就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update*作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。

可以用 SELECT LAST_INSERT_ID(); 查询LAST_INSERT_ID的值.

使用单INSERT语句插入多条记录, LAST_INSERT_ID只返回插入的第一条记录产生的值.

 (3)select @@IDENTITY:

String sql=”select @@IDENTITY”;

@@identity是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。一般系统定义的全局变量都是以@@开头,用户自定义变量以@开头。比如有个表A,它的自增列是id,当向A表插入一行数据后,如果插入数据后自增列的值自动增加至101,则通过select @@identity得到的值就是101。使用@@identity的前提是在进行insert操作后,执行select @@identity的时候连接没有关闭,否则得到的将是NULL值。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在SQL Server或MySQL建立一个数据库,在该数据库建立一个图书表bookList(ISBN varchar,name varchar ,price float, chubanDate date),其ISBN为主键,然后插入若干记录,最后使用随机查询语句SELECT * FROM bookList ORDER BY RAND() LIMIT 10,计算图书的平均单价。 ### 回答2: 在Sql Server或MySql建一个数据库时,可以使用如下的SQL语句: ``` CREATE DATABASE BookDatabase; ``` 接着,在建的数据库建立一个名为bookList的表,表结构如下所示: ``` CREATE TABLE bookList ( ISBN varchar(20) PRIMARY KEY, name varchar(100), price float, chubanDate date ); ``` 然后,我们可以插入若干条记录到bookList表,如下所示: ``` INSERT INTO bookList (ISBN, name, price, chubanDate) VALUES ('9787506267580', '《数据库系统概论》', 59.9, '2022-01-01'), ('9787121377989', '《Python编程从入门到实践》', 79.8, '2021-10-01'), ('9787111592618', '《深入理解Java虚拟机》', 99.5, '2022-02-15'), ('9787115477379', '《Java核心技术卷I》', 69.9, '2022-03-01'), ('9787111604700', '《JavaScript高级程序设计》', 89.5, '2021-12-10'), ('9787302444541', '《算法导论》', 129.0, '2022-01-20'); ``` 然后,我们可以随机查询10条记录,并计算图书的平均单价,如下所示: ```sql SELECT TOP 10 * FROM bookList ORDER BY NEWID(); SELECT AVG(price) AS 平均单价 FROM bookList; ``` 通过以上步骤,我们就可以在Sql Server或MySql建立一个数据库,并且对插入的记录进行随机查询,最后计算图书的平均单价。 ### 回答3: 在SQL Server或MySQL建立一个数据库,库建立一个图书表`bookList`,其包含以下字段: - `ISBN`:图书的唯一标识,作为主键,类型为`varchar`。 - `name`:图书的名称,类型为`varchar`。 - `price`:图书的价格,类型为`float`。 - `chubanDate`:图书的出版日期,类型为`date`。 在表插入若干记录,可以使用如下的SQL语句: ```sql INSERT INTO bookList(ISBN, name, price, chubanDate) VALUES ('ISBN1', '书籍1', 29.99, '2021-01-01'), ('ISBN2', '书籍2', 39.99, '2020-02-15'), ('ISBN3', '书籍3', 19.99, '2022-03-27'), ('ISBN4', '书籍4', 49.99, '2019-11-11'), ('ISBN5', '书籍5', 59.99, '2021-06-30'), ('ISBN6', '书籍6', 9.99, '2020-09-18'), ('ISBN7', '书籍7', 79.99, '2022-04-05'), ('ISBN8', '书籍8', 69.99, '2020-07-22'), ('ISBN9', '书籍9', 89.99, '2021-08-10'), ('ISBN10', '书籍10', 99.99, '2022-02-28'); ``` 现在需要随机查询10条记录,可以使用如下的SQL语句: ```sql SELECT * FROM bookList ORDER BY RAND() LIMIT 10; ``` 计算图书的平均单价,可以使用如下的SQL语句: ```sql SELECT AVG(price) AS averagePrice FROM bookList; ``` 以上就是在SQL Server或MySQL建立一个数据库,并进行插入记录、随机查询记录以及计算图书的平均单价的操作。注意,对于实际情况,需根据具体的数据库管理系统进行相应的语法修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值