4

谁能帮助我如何在一次提交中提交多行?

此调查表将显示一组源自桌面技能的技能。老师必须在复选框中检查学生的技能并单击提交。

一个学生可以拥有不止一项技能。如果他有3个技能,那么一旦老师点击提交按钮,发送到数据库的数据将是3行。(表学生技能)

<cfoutput query="skill">
<tr>
    <td>#skill.skillname#</td>
    <td align="center">:</td>
    <td><input type="checkbox" name="skillid" value="skillid" checked="checked"></td>
</tr>
</cfoutput>

餐桌技巧

+---------+------------+
| skillid | skillname  |

+---------+------------+

| 1       | draw       |

+---------+------------+

| 2       | read       |

+---------+------------+

| 3       | dance      |

+---------+------------+

表学生技能

+----------+----------|

|studentid | skillid  |

+----------+----------+
| 001      | 1        |
| 001      | 2        |
| 002      | 1        |
| 002      | 2        |
| 002      | 3        |
+----------+----------+
4

2 回答 2

5

假设您使用的是 SQL Server 2008,您应该能够使用以下语法:

INSERT INTO StudentSkill (StudentID, SkillID)
VALUES (100, 1), (100, 2), (100, 3)

此方法从此处收集,其中还包含一些替代方法。

您只需要遍历 FORM.skillid 中的 ID 列表(假设这就是您的表单的工作方式)来构建上面的 SQL。此外,请确保<CFQueryParam>在构建 SQL 时使用这些值。像下面的代码应该做的事情:

<cfif ListLen(FORM.skillid)>
  <cfquery>
   INSERT INTO StudentSkill (StudentID, SkillID)
    VALUES
   <cfloop list="#form.skillid#" index="skill">
     (<cfqueryparam value="#form.studentID#" CFSQLType="CF_SQL_INTEGER">, 
       <cfqueryparam value="#skill#" CFSQLType="CF_SQL_INTEGER">)
   </cfloop>
  </cfquery>
</cfif>
于 2012-11-22T09:39:16.873 回答
1

另一种插入多条记录的简单方法是INSERT .. SELECT. (在发布的链接banyr中也提到了)。因为技能 ID 存储在另一个表中,所以您可以对它们使用IN子句SELECTstudenSkill然后通过简单的查询 将这些值直接插入到您的另一个表中,无需循环。

INSERT INTO studenSkill ( studenId, skillId )
SELECT <cfqueryparam value="#form.studentId#" cfsqltype="cf_sql_integer">
       , skillId
FROM   skill
WHERE  skillId IN 
       (
       <cfqueryparam value="#form.skillId#" cfsqltype="cf_sql_integer" list="true">
       )



    <input type="checkbox" name="skillid" value="skillid" checked="checked">

顺便说一句,如果这不是拼写错误,请不要忘记查询列名称周围的 # 符号,即“skillid”

  <input type="checkbox" name="skillid" value="#skillid#" checked="checked">
于 2012-11-23T21:59:58.720 回答