2016-09-29 52 views

回答

0

我意识到我无法为每个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> 

对我有点冗长。

+0

那么多的逻辑通常更好地包装在存储过程中。如果您必须使用单独的查询,请记住临时表是基于会话的(与CF会话不同)。所以查询应该包装在一个cftransaction中,以确保你维护同一个session或db连接。虽然[如我所说](http://stackoverflow.com/a/39987760/104223),它似乎并不需要临时表。 – Leigh

0

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

allowMultiQueries

允许使用的 ';'一个声明(真/假),默认为“假”

期间分隔多个 查询说了这么多,不知道为什么你需要一个临时表。一个简单的INSERT/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">