db2中插入数据后直接返回主键(自增列id)的sql怎么写

db2中插入数据后直接返回主键(自增列id)的sql怎么写,第1张

db2

=>

CREATE

TABLE

test_create_tab2

(

db2

(cont.)

=>

id

INT

NOT

NULL

PRIMARY

KEY

generated

always

as

identity,

db2

(cont.)

=>

val

VARCHAR(10)

db2

(cont.)

=>

)

DB20000I

SQL

命令成功完成。

db2

=>

INSERT

INTO

test_create_tab2(val)

VALUES

('NO

id')

DB20000I

SQL

命令成功完成。

这里和

SQL

Server

一样,大家都不能手动指定那个

自增id

的数值

db2

=>

INSERT

INTO

test_create_tab2(id,

val)

VALUES

(1,

'id

no

use')

DB21034E

命令被当作

SQL

语句来处理,因为它是无效的“命令行处理器”命令。在

SQL

处理期间,它返回:

SQL0798N

不能为定义为

GENERATED

ALWAYS

的列

"ID"

指定值。

SQLSTATE=428C9

这里和

SQL

Server

不一样,SQL

Server

会自动排除掉那个自动递增的列

db2

=>

INSERT

INTO

test_create_tab2

VALUES

('Is

Auto

?')

DB21034E

该命令被当作

SQL

语句来处理,因为它是无效的“命令行处理器”命令。在

SQL

处理期间,它返回:

SQL0117N

赋值数目与指定的或隐含的列数或变量数不一样。

SQLSTATE=42802

关于

初始数值的设定。

db2

=>

drop

TABLE

test_create_tab2

DB20000I

SQL

命令成功完成。

db2

=>

CREATE

TABLE

test_create_tab2

(

db2

(cont.)

=>

id

INT

NOT

NULL

PRIMARY

KEY

generated

always

as

identity

db2

(cont.)

=>

(Start

With

100

db2

(cont.)

=>

Increment

by

1

db2

(cont.)

=>

minvalue

100

db2

(cont.)

=>

maxvalue

999999999

db2

(cont.)

=>

no

cycle

cache

5

no

order),

db2

(cont.)

=>

val

VARCHAR(10)

db2

(cont.)

=>

)

DB20000I

SQL

命令成功完成。

db2

=>

INSERT

INTO

test_create_tab2(val)

VALUES

('NO

id')

DB20000I

SQL

命令成功完成。

db2

=>

select

*

from

test_create_tab2

ID

VAL

-----------

----------

100

NO

id

1

记录已选择。

db2

=>

select

identity_val_local()

from

SYSIBM.SYSDUMMY1

1

---------------------------------

100.

1

条记录已选择。

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

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

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

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

var

sql:string

id1:integer

begin

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

query1.close

query1.sql.clear

query1.sql.add(sql)

query1.Execsql

id1:=query1.fieldbyname('id').asinteger

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

//后面的代码略

...

...

end

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

var

id1:integer

begin

query1.append

query1.fieldbyname('字段A').asstring = '内容'

query1.post

id1:=query1.fieldbyname('ID').asinteger

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

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

end

在ACCESS数据库中,不能用SCOPE_IDENTITY或者 LAST_INSERT_ID(),只能用于SQL数据库中。

还是分两条语句吧。先取最后一ID号再加1就是要返回的ID,用另一语句存入该ID就可以了。

sql="insert into Productinfo([ProductName],[CateID]) values('"&ProductName&"',"&CateID&")"

set rs_conn=conn.execute("select top 1 id from Productinfo order by id desc")

sql_conn="insert into ProductConn([ProID],[CateID]) values("&rs_conn("id")+1&"," &CateID&")"

conn.execute(sql)

conn.execute(sql_conn)


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

原文地址: http://outofmemory.cn/bake/11904902.html

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

发表评论

登录后才能评论

评论列表(0条)

保存