在 ColdFusion 中创建临时表(复制没有重复 ID 的记录)

Creating temp tables in ColdFusion (copying records without duplicate id)

我知道,我知道,这比你奶奶还大,但我一辈子都想不通为什么我可以在 phpmyadmin 上执行以下查询,但不能在 cfquery 标记中执行。

  DROP TABLE IF EXISTS temp;
  CREATE TEMPORARY TABLE temp ENGINE=MEMORY

我意识到我不能对每个 cfquery 标签进行多个查询。本质上,这是为了使用 ColdFusion 复制 MySQL 中的记录。如果有人可以进一步简化这一点,我将不胜感激。

  <cfquery datasource="#request.datasource#">
      DROP TABLE IF EXISTS temp
  </cfquery>
  <cfquery result="copied" datasource="#request.datasource#">
      CREATE TABLE temp ENGINE=MEMORY
      SELECT * FROM mytable WHERE id= <cfqueryparam value="#id_im_looking_for#">
  </cfquery>

  <cfquery result="copied" datasource="#request.datasource#">
    INSERT INTO mytable SELECT NULL, name, description, NOW() FROM temp
  </cfquery>

  <cfquery datasource="#request.datasource#">
    DROP TABLE temp
  </cfquery>

对我来说有点冗长。

当使用 JDBC driver 时,出于安全原因,默认情况下禁用多条语句的执行。通过将 allowMultiQueries=true 添加到 DSN“连接设置”,可以在您的 DSN 中启用它。请注意,启用此设置会将数据库暴露给某些形式的 sql 注入。所以一定要在所有查询参数上使用 cfqueryparam

allowMultiQueries

Allow the use of ';' to delimit multiple queries during one statement (true/false), defaults to 'false'

话虽如此,但不确定为什么需要临时 table。一个简单的 INSERT / SELECT 应该可以解决问题。没有理由不能从同一个 table 插入和 select。除非最终结果违反约束。

 INSERT INTO mytable ( Name, Description, SomeDateCol )
 SELECT name, description, NOW() 
 FROM   mytable 
 WHERE  id = <cfqueryparam value="#id_im_looking_for#" cfsqltype="cf_sql_YourTypeHere">