我知道,我知道,这比你的祖母年长,但我无法弄清楚为什么我可以在phpmyadmin上执行以下查询但我的生活不在cfquery
标签中。在ColdFusion中创建临时表(复制没有重复ID的记录)
DROP TABLE IF EXISTS temp;
CREATE TEMPORARY TABLE temp ENGINE=MEMORY
我知道,我知道,这比你的祖母年长,但我无法弄清楚为什么我可以在phpmyadmin上执行以下查询但我的生活不在cfquery
标签中。在ColdFusion中创建临时表(复制没有重复ID的记录)
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时,出于安全原因,默认情况下会禁用多个语句的执行。它可以在您的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">
那么多的逻辑通常更好地包装在存储过程中。如果您必须使用单独的查询,请记住临时表是基于会话的(与CF会话不同)。所以查询应该包装在一个cftransaction中,以确保你维护同一个session或db连接。虽然[如我所说](http://stackoverflow.com/a/39987760/104223),它似乎并不需要临时表。 – Leigh