
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)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)