如何在sql中插入记录时返回id(id为自动增长)

如何在sql中插入记录时返回id(id为自动增长),第1张

IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。例如,有两个表 T1 和 T2,在 T1 上定义了一个 INSERT 触发器。当将某行插入 T1 时,触发器被激发,并在 T2 中插入一行。此例说明了两个作用域:一个是在 T1 上的插入,另一个是作为触发器的结果在 T2 上的插入。假设T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSERT 语句的最后返回不同的值。@@IDENTITY 返回插入到当前会话中任何作用域内的最后一个 IDENTITY 列值,该值是插入 T2 中的值。SCOPE_IDENTITY() 返回插入 T1 中的 IDENTITY 值,该值是发生在相同作用域中的最后一个 INSERT。如果在作用域中发生插入语句到标识列之前唤醒调用 SCOPE_IDENTITY() 函数,则该函数将返回 NULL 值。而IDENT_CURRENT('T1') 和 IDENT_CURRENT('T2') 返回的值分别是这两个表最后自增的值。ajqc的实验:(40条本地线程,40+40条远程线程同时并发测试,插入1200W行),得出的结论是:1在典型的级联应用中不能用@@IDENTITY,在CII850,256M SD的机器上1W多行时就会并发冲突在P428C,512M DDR上,才6000多行时就并发冲突2SCOPE_IDENTITY()是绝对可靠的,可以用在存储过程中,连触发器也不用建,没并发冲突 SELECT IDENT_CURRENT('TableName') --返回指定表中生成的最后一个标示值SELECT IDENT_INCR('TableName')--返回指定表的标示字段增量值SELECT IDENT_SEED('TableName')--返回指定表的标示字段种子值返回最后插入记录的自动编号SELECT IDENT_CURRENT('TableName')返回下一个自动编号:

用触发器,insert后查询inserted表中的marks

CREATE trigger afterAdd on table1 for insert

as

declare @mark varchar(10)

select @mark=mark from inserted

--这样可以取出@mark的值了,接下去按你的意图写就可以了

1、首先打开安装的SQL数据库

2、在打开的数据库页面左侧的菜单中,点击打开“数据库”;

3、右键需要查询标识ID的数据库,选择“新建查询”;

4、然后在右侧页面内输入“select空格数据库名字”;

5、然后点击右上角的“执行”;

6、在数据库的最下面所得到的查询结果就是查询的标识ID号。

你的这个需求好象直接再把记录插入到表2就可以,但我估计你不是这个意思。

比较笨的办法,可以定义一个数组用于记录表1的ID值,或者用个临时表来记录表一新增加的记录ID列表。

insert后,query的指针应该还是停留在最新增加的记录上的,因此是可以取得到ID值的。

代码如下,假设表一只有二个字段,一个是ID(自动增量),一个是字段A(字符型),

var

sql:string;

id1:integer;

begin

sql:='insert into 表一 ('''+字段A+''') values ('''+ '内容'+''')';

query1close;

query1sqlclear;

query1sqladd(sql);

query1Execsql;

id1:=query1fieldbyname('id')asinteger;

//接下来可以把ID1的值写入临时表或者数组了,如果是需要不同的机器取得ID值,可以用临时表,不过速度会慢些,如果只是本机取得,就用数组好了。

//后面的代码略

end;

上述代码我没有条件试,应该可以,另外还可以用append的方法追加记录,这样就一定可以用上面的方法取到ID值了。

var

id1:integer;

begin

query1append;

query1fieldbyname('字段A')asstring = '内容';

query1post;

id1:=query1fieldbyname('ID')asinteger;

//这种方法一定可以取得到ID值。

//后面你自行对取得的ID进行存储就行了,临时表或者数组都可以。代码略

end;

1、对于提交(最后一次 *** 作commit了)的话可以查询那个提交段

SELECT 列名1,列名2……

FROM 表名 VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE where

VERSIONS_STARTTIME IS NOT null ORDER BY VERSIONS_STARTTIME DESC;

查出来的第一条就是最后改变的数据

2、如果表里面有序列或固定的排序字段可按倒排序后取第一条

where rownum<2 order by 排序字段 desc

3、还有另外一种办法就是利用ORACLE伪列rowid

select from tbl t1 where t1rowid=(select max(rowid) from tbl t2)

4、在redo log中找到对应相关的表的插入语句,但是这样找到的是sql语句,而不是数据。查redo log得使用log miner工具

这种方式只能使用数据库自带的序列:

1、首先创建一个序列,举例:

create sequence a_seq --创建序列名字为 a_seq

minvalue 1 -- 最小值为 1

maxvalue 99999 --- 最大值为 99999

start with 1 --- 开始值 1

increment by 1 ---每次增长值 1

cache 100; ----缓存大小 100

2、程序中取序列下一值作为自己使用:

SELECT a_seq nextval INTO :Nid FROM DUAL;

然后将Nid的作为要插入的数据值就可以了。

这是数据库的语句,至于使用的C中,就看你是用什么方式访问数据库,使用对应的数据库方法执行对应SQL就可以了。

以上就是关于如何在sql中插入记录时返回id(id为自动增长)全部的内容,包括:如何在sql中插入记录时返回id(id为自动增长)、Sql server 如何获得新插入的ID、SQL怎么查询每个数据库的标识ID号(数据库表的id)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9614811.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存