2012-08-07 27 views
2

我插入到两个表中。进入第一张桌子会有一个新的'物品'。有很多领域,但为了简单起见,我只会告诉你我需要什么。这是我的ColdFusion页:将查询中的自动增量作为变量在另一个查询中使用

<cfquery> 
    INSERT INTO my_item_table (itemid, a bunch of other stuff) 
    VALUES (itemid_sequence.nextval, a bunch of other stuff) 
</cfquery> 

我的问题是我要插入自动增加为itemid的值到另一个表,文件附件表。同样的ColdFusion页:

<cfquery> 
    INSERT INTO my_attachments_table (attachno, itemid, filename) 
    VALUES (attachment_sequence.nextval, **AUTO-INCREMENT VALUE HERE**, '#url.fileName#') 
</cfquery> 

我知道我可以查询项目表对于刚刚进入第一个表中的值,但即使它是不太可能,有可能是用户输入不唯一的,这意味着相同字段的查询可能会返回多行。在这种情况下,我无法获得itemid。在查询中创建的itemid是唯一的唯一标识符。

我的问题是:有没有办法将auto = increment设置为查询内的值,以便我可以在外部使用它?如果没有,你会如何建议获得我的itemid?谢谢。

回答

1

你可以通过检索下一个序列值到一个变量,这样的查询开始:

SELECT itemid_sequence.nextval FROM DUAL 

(DUAL是Oracle的虚拟表)。您可以在两个INSERT查询中继续使用这个变量。

另一种选择:在数据库中创建一个存储过程,它将为您启动两个查询。

+1

我不是Oracle专家 - 听起来Danny知道他在说什么 - 但是当您在一个查询中插入CF时,然后在下一个查询中获取自动增量的结果时,您会遇到并发问题(另一个请求同时增加了字段)。确保并使用交易 - 或者丹尼建议的存储过程 - 以避免这种可能性。 – 2012-08-07 13:12:26

+1

或者,您可以在插入查询中获取增量值*,并将其作为结果返回。 – 2012-08-07 13:13:42

+0

我该如何将它设置为一个变量?据我所知,你会cfoutput这个查询,但没有列名定义引用。即这将如何工作? 2012-08-07 13:14:03

5

如果在ColdFusion 8/9/10中执行插入操作,它将返回标记结果属性中插入行(或多行)的ID。例如,如果您使用的是SQL Server,则result_name.IDENTITYCOL是对插入行ID的引用。如果你使用的是MySQL,那就是result_name.GENERATED_KEY。

+0

如果我使用Oracle? – 2012-08-07 13:16:33

+0

在Oracle中它将返回不是表的主键的行ID。 – 2012-08-07 13:43:23

+0

老鼠...我总是忘记 - 从cf8开始。很好的布莱恩。 – 2012-08-07 16:20:29