我有一个名为“问题”的表。此表可能有多个问题。在这里,我循环遍历插入查询以插入所有问题值以便有重复的问题。它成功添加了问题,但问题是我无法获取最近插入的问题记录ID的列表或数组。
这是代码。
<cfloop query="questions">
<cfquery name="insertDuplicatequestions">
INSERT INTO questions (
survey_Id, questiontype_Id, question, rank, isrequired
)
VALUES
(
<cfqueryparam cfsqltype="cf_sql_bigint" value="#getSurveyid.id#">
, <cfqueryparam cfsqltype="cf_sql_bigint" value="#questions.questiontype_Id#">
, <cfqueryparam cfsqltype="cf_sql_varchar" value="#questions.question#">
, <cfqueryparam cfsqltype="cf_sql_numeric" value="#questions.rank#">
, <cfqueryparam cfsqltype="cf_sql_integer" value="#questions.isrequired#">
)
<cfif questions.CurrentRow LT questions.RecordCount>,</cfif>
</cfquery>
<cfquery name="getQuestionid">
SELECT LAST_INSERT_ID() AS id
</cfquery>
<cfset response = getQuestionid.id>
</cfloop>
我尝试过LAST_INSERT_ID(),但它会检索最后一个和单个记录ID。任何人都可以告诉我,无论如何都要知道这一点。感谢。
答案 0 :(得分:4)
没有本地方法可以做到这一点。您最好的调用是在表格中添加一个时间戳列,表示插入日期(默认情况下,TIMESTAMP
字段将NOW()
作为默认值。)
或者,您可以从应用程序代码中检查每次插入的结果(例如,使用LAST_INSERT_ID()
)。然后在应用程序代码中构建数组。
答案 1 :(得分:2)
(更多的附录,但评论太长了......)
Like RandomSeed said,MySQL中不支持捕获由insert
生成的多个记录ID。他描述的替代方案之一是单独插入记录,并在每次迭代时捕获新ID。以下是使用cfquery的result
属性如何做到这一点的大致概述。
<!--- initialize array that will store the new ids -->
<cfset idArray = []>
<!--- use a transaction to ensure ALL of the inserts succeed or fail together -->
<cftransaction>
<cfloop ...>
<!--- use the "result" attribute to capture the new id --->
<cfquery result="addRecord" ....>
INSERT INTO YourTable (...) VALUES (...);
</cfquery>
<!--- save the id in the array -->
<cfset arrayAppend(idArray, addRecord.GENERATED_KEY)>
</cfloop>
</cftransaction>
<!--- display new id's --->
<cfdump var="#idArray#">
顺便说一句,虽然您可以使用LAST_INSERT_ID()
,但通常应将其放在与INSERT相同的cfquery
标记内,以确保您获得当前连接的最后一个ID。注意:要使其正常工作,请the datasource settings must allow multiple statements(默认情况下不启用)。
答案 2 :(得分:0)
last_insert_id()
就像它的名字一样:你得到你插入的最后记录的ID。如果您要插入多条记录,那么您必须为每条记录执行last_insert_id()。无法检索先前插入的ID - 这些ID将丢失。