将信息插入连接表ColdFusion

时间:2014-03-17 20:55:14

标签: php sql coldfusion

在博客帖子页面上,我将Title,Body和UserID(作者表中的外键)添加到我的BlogPost表中:

<!--- Query to Insert Blog --->
<cfquery Result="blogEntry" datasource="prpblog">
    INSERT INTO BlogPosts (Title, BlogBody, UserID)
    VALUES
    (
        <cfqueryparam value='#Form.Title#' cfsqltype="cf_sql_varchar"/>,  
        <cfqueryparam value='#Form.BlogBody#' cfsqltype="cf_sql_varchar"/>, 
        <cfqueryparam value='#Form.SelectAuthor#' cfsqltype="cf_sql_numeric"/>
    )
</cfquery>

然后我想将博客所包含的标签添加到Junction表中(因为属于多个博客/博客的多个标签所引起的多对多关系)

我知道如何将标记插入到联结表中,但是如何将我的blogID插入此表?输入新博客时,BlogID是自动编号。

Junction Table列示例:

    BlogID  TagID
    10          1
    10          10
    10          13
    9           10
    9           1

<Select name="SelectTag" multiple="multiple" size="6">
<cfoutput QUERY="Tags"><option value="#TagID#">#Tag#</option></cfoutput>
</select>

<cfquery name="AddTag" datasource="prpblog">
    INSERT INTO BlogTagJunction (TagID)
    VALUES
    (
                <cfqueryparam value='#Form.???' cfsqltype="cf_sql_numeric"/>
        <cfqueryparam value='#Form.SelectTag#' cfsqltype="cf_sql_numeric"/>
    )
</cfquery>

2 个答案:

答案 0 :(得分:2)

  

我自己通过在后面创建一个查询语句来解决问题   插入从博客I抓取博客ID的博客的声明   刚刚创建:

仅当Title列上有唯一索引时才会有效。但是,您可能甚至不需要单独的查询。如果BlogID是某种自动递增列(标识,自动增量,...),请使用result attribute of cfquery从您的第一个INSERT语句中检索生成的ID值。确切的语法是db dependent。

鉴于TagID的源是另一个数据库表,跳过循环并使用INSERT/SELECT在单个语句中生成联结表记录更简单。您没有说明您的DBMS,但是对于SQL Server这样的东西。根据需要更改“cfsqltypes”:

  <!--- create the blog entry --->
  <cfquery result="blogEntry" ....>
       INSERT INTO BlogPost ( Title, Body, UserID )
       VALUES  
       (
         ... the values here  ....
       )
  </cfquery>

  <!--- associate the new blog entry with the selected tag id's --->
  <cfquery ....>
     INSERT INTO BlogTagJunction (BlogID, TagID)
     SELECT  <cfqueryparam value="#blogEntry.IDENTITYCOL#"  
                        cfsqltype="cf_sql_integer">
            , TagID
     FROM  YourTagTable
     WHERE TagID  IN
           (
              <cfqueryparam value="#Form.SelectTag#" 
                   list="true" 
                   cfsqltype="cf_sql_numeric"/>
           )
  </cfquery>

注意:请务必在cftransaction中包装两个查询以确保数据完整性。

从评论中更新:

如果您使用的是MS Access,则表示使用result属性。 CFQuery不支持MS Access的该功能。因此,您需要使用另一种方法来获取新创建的ID。

正如this link 中所讨论的,有几种方法可以做到这一点。其中之一是在表中添加UUID列。 MS Access的另一个选项是使用@@identity变量。将记录插入带有“自动编号”列的表后,@@ identity值将包含新记录的ID。 This blog contains an example。注意:正如我在你的其他帖子中所提到的,你必须在cftransaction中附上两个查询,否则它将无法正常工作。

总之,你需要做三件事:

  1. INSERT BlogPost
  2. 的新记录
  3. 抓住您刚刚创建的新BlogID
  4. 使用步骤#2中的新ID
  5. 将选定的tagID插入BlogTagJunction

    同样,使用MS Access,您无法跳过此处的cftransaction,否则无法使用。把它们放在一起:

    <cftransaction>
    
        <!--- create the blog record --->
        <cfquery result="blogEntry" ....>
            INSERT INTO BlogPost ( Title, Body, UserID )
            VALUES  
            (
            ... the values here  ....
            )
        </cfquery>
    
        <!--- get the ID of the record you just inserted --->
        <cfquery name="getNewRecord">
            SELECT  @@identity AS TheNewID
        </cfquery>
    
        <!--- Use that new ID to associate blog and selected tag id's --->
        <cfquery ....>
            INSERT INTO BlogTagJunction (BlogID, TagID)
            SELECT  <cfqueryparam value="#getNewRecord.TheNewID#"  
                        cfsqltype="cf_sql_integer">
                   , TagID
            FROM  YourTagTable
            WHERE TagID  IN
            (
                <cfqueryparam value="#Form.SelectTag#" 
                   list="true" 
                   cfsqltype="cf_sql_numeric"/>
            )
        </cfquery>
    
    </cftransaction>
    

答案 1 :(得分:0)

我自己通过在博客的insert语句之后创建一个查询语句来解决问题,该博客从我刚创建的博客中获取博客ID:

<CFQUERY name="BlogID" datasource="blog">
SELECT BlogID
FROM BlogPosts
WHERE Title = '#Form.Title#'
</CFQUERY>  

然后我执行CFoutput输出查询的BlogID值。