当前位置: 首页 > 面试题库 >

ColdFusion:如何在一个插入中插入带有静态外键的列表?

诸葛卜霸
2023-03-14
问题内容

我有一个列表,例如:thing1,thing2,thing3。我想将它们插入具有相同外键的查找表中。因此理想情况下,它看起来应该像这样:

<cfquery datasource="#ds#" result="insert_things">
    INSERT INTO lkp_things (foreign_key, thing) VALUES
    (1, thing1), (1, thing2), (1, thing3)
</cfquery>

看来完成此操作的唯一方法是将列表转换为查询,但是我想知道,是否有更简单的方法?

这是我尝试过的:

<cfquery datasource="#ds#" result="insert_things">
    INSERT INTO lkp_things (foreign_key, thing) VALUES
    <cfloop list="#things#" index="thing">
        (#id#,#thing#)<cfif ?????? NEQ len(#things#)>,</cfif>
    </cfloop>
</cfquery>

我听说您无法在cfquery中执行cfloop,但是我什至不确定这是否成立,因为VALUES中没有逗号,并且我不确定如何说“
cfloop中的“当前迭代编号”。如果将列表转换为查询,则可以执行currentRow,但是再次,我想在进行所有操作之前先知道是否有更简单的方法来完成此操作。

另外,我正在使用CF 8和sql server ‘08编辑:对不起,我实际上是在使用2000。


问题答案:

更新:

最终,真正的问题在于,VALUES仅在SQL Server
2008+中支持使用单个子句插入多组值的功能,而OP使用的是2000。因此,它们改用select / union
all方法

(从评论中扩展)

确保您可以在内循环cfquery。首先在CF服务器上处理所有cfml代码。然后,将所得的SQL字符串发送到数据库以执行。只要您的CF代码产生有效的SQL语句,您就可以做任何您想做的事情:)是否应该是一个不同的问题,但是这种循环是完全可以的。

回到您的问题,只需切换到from/to循环,然后使用列表函数(如getToken(list, index)获取单个元素)(请参见Matt的示例)或使用数组即可。显然,您还应该首先验证列表是否为空。我个人的喜好是数组。未经测试,但类似这样:

    <cfset thingArray = listToArray(things, ",")>

    <cfquery datasource="#ds#" result="insert_things">
       INSERT INTO lkp_things (foreign_key, thing) VALUES
       <cfloop from="1" to="#arrayLen(thingArray)#" index="x">
           <cfif x gt 1>,</cfif>
           ( 
              <!--- Note: Replace cfsqltype="..." with correct type --->
               <cfqueryparam value="#id#" cfsqltype="..."> 
             , <cfqueryparam value="#thingArray[x]#" cfsqltype="..."> 
           )
       </cfloop>
    </cfquery>

话虽如此,您的#thing#名单的来源是什么?如果这些值存在于数据库表中,则可以使用SELECT语句而不是循环直接将它们插入:

       INSERT INTO lkp_things (foreign_key, thing) 
       SELECT <cfqueryparam value="#id#" cfsqltype="...">, thing
       FROM   ThingTable
       WHERE  thing IN 
              (
                <cfqueryparam value="#thingList#" list="true" cfsqltype="..."> 
              )


 类似资料:
  • 问题内容: 我有本身具有外键的表。列 parentid 是外键, 不能 为NULL。 如果我这样做,那么它说不能将NULL插入 父母的父母 。但是,如果还没有插入行,我可以为它设置什么值呢? 我如何编写将向该表添加行的脚本? 谢谢 问题答案: 技巧:拥有一个带有虚拟密钥的虚拟行,例如99999。将其插入为FK,然后将FK更改为其实际值。并在交易中完成。

  • 问题内容: 我想进行批量插入事务,但是我不太确定如何使用CTE或更有效的方法来执行此操作。这是我到目前为止的内容: 我的CTE的问题是我不知道如何从要插入的第一条插入语句中获取单个ID到第二条具有“ product_id”外键的语句的相应记录中。 我将如何构造该语句以使其起作用?我对其他解决方案持开放态度,这些解决方案提供了更有效的方法来实现相同的结果。 问题答案: 以下是您要做什么的合理解释:

  • 问题内容: 我想将行插入具有唯一,非自动递增主键的表中。 是否有本机SQL函数来评估最后一个键并将其递增,还是我必须分两个步骤进行操作: 问题答案: 从整个注释来看,您在表上有一个主键,而不是标识列。 如果您的SQL Server版本是SQL 2012,则应查看序列:http : //msdn.microsoft.com/zh- cn/library/ff878091.aspx 在其他版本中,您需

  • 问题内容: 我有两个实体: 我正在尝试通过执行以下操作插入文件(以及随后的标签): 然后,我使用以下命令将文件插入DAO: 在我的日志中,我在“文件”表中看到一个插入,在标签表中看到2个插入,但是,指向我的文件表(file_id)的标签表中的外键为NULL。 我可能做错了什么? 问题答案: 您不是将标签的文件设置为文件,而是将标签的文件设置为文件。请记住,在OOP中,与关系模型相反,您必须设置关系

  • 批量订单 Purchorder 我已经试了一个星期了。我有这两个表,batchporder和purchord在batchporder表中,我需要插入一行,并获得传递给purchord插入的主id。在purchord中,我需要插入多行,因此我使用了insert\u batch。 控制器 模型 错误1 遇到PHP错误严重性:警告 消息:array_keys()要求参数1为数组,字符串为给定值 文件名: