插入ColdFusion和MySQL后获取表ID

Seq*_*zia 14 mysql sql-server coldfusion

我正常的插入一个表然后获取ID以便我可以插入到另一个表中的过程在MSSQL中是这样的:

DECLARE @transactionKey uniqueidentifier
SET @transactionKey = NEWID()

INSERT INTO transactions(transactionKey, transactionDate, transactionAmount)
    VALUES(@transactionKey, '#transactionDate#', '#transactionAmount#')

DECLARE @transactionID int
SELECT @transactionID = transactionID
    FROM transactions
    WHERE transactionKey = @transactionKey


INSERT INTO transactionItems(transactionID, itemID, itemAmount)
    VALUES(@transactionID, '#itemID#', '#itemAmount#')


SELECT @transactionID as transactionID
Run Code Online (Sandbox Code Playgroud)

我的问题是2部分.首先,这是最好的方法吗?我读到GUID有可能在我身上发生变化,我最终在第二个表中出现了无效的GUID.我假设这个机会非常渺茫,我多年来一直在各种项目上做这件事并且从来没有遇到过问题.

我的问题的第二部分是在MySQL中做这样的工作吗?我开始使用MySQL开发一个新项目,我不确定最好的方法.我通常只在MSSQL上工作过.

我在这个新项目上使用CF9和MySQL.

对此的任何帮助都会很棒.

提前致谢.

Aar*_*lee 26

第1部分: 我个人不会在单个查询中批处理多个语句,以降低SQL注入的风险.这是ColdFusion管理员的数据源中的设置.执行存储过程(可能正在执行的操作(?))是另一个故事,但是,如果这是您的意图,您应该将您的问题改为"使用mySQL存储过程插入后获取主键".

第2部分: 与许多事情一样,ColdFusion使得为新插入的记录获取主键非常容易 - 即使您使用的是自动增量键,GUID或类似Oracle的ROWNUM.这适用于Adobe ColdFusion支持的几乎所有数据库,包括MSSQL或MySQL.唯一的例外是数据库的版本 - 例如,MySQL 3不支持这个; 但是,MySQL 4+会.

<cfquery result="result">
  INSERT INTO myTable (
      title
  ) VALUES (
    <cfqueryparam value="Nice feature!" cfsqltype="cf_sql_varchar">
  )
</cfquery>

<--- get the primary key of the inserted record --->
<cfset NewPrimaryKey = result.generatedkey>
Run Code Online (Sandbox Code Playgroud)

从CF9 +开始,您可以使用通用密钥名称访问新ID(对于任何数据库):

result.GENERATEDKEY    // All databases
Run Code Online (Sandbox Code Playgroud)

对于CF8,不同的数据库在结果值中将具有不同的键.这是一个简单的表,以帮助我从cfquery文档中复制.

result.identitycol    // MSSQL
result.rowid          // Oracle
result.sys_identity   // Sybase
result.serial_col     // Informix
result.generated_key  // MySQL
Run Code Online (Sandbox Code Playgroud)

如果您有任何疑问,可以看到如下的漂亮转储:

<cfdump var="#result#" />
Run Code Online (Sandbox Code Playgroud)