有人可以帮助我如何在一次提交中提交多行吗?
此调查表格将显示一组源自表格技能的技能。 教师必须在复选框中检查学生技能,然后单击“提交”。
学生可以拥有多项技能。 如果他有3种技能,那么一旦教师点击提交按钮,发送到数据库的数据将分为3行。 (表studentkill)
<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 |
+---------+------------+
表studentkill
+----------+----------|
|studentid | skillid |
+----------+----------+
| 001 | 1 |
| 001 | 2 |
| 002 | 1 |
| 002 | 2 |
| 002 | 3 |
+----------+----------+
答案 0 :(得分:5)
假设您使用的是SQL Server 2008,则应该能够使用以下语法:
INSERT INTO StudentSkill (StudentID, SkillID)
VALUES (100, 1), (100, 2), (100, 3)
此方法从here收集,其中还包含一些替代方法。
您只需要迭代FORM.skillid中的ID列表(假设您的表单是如何工作的)来构建上面的SQL。此外,请确保在构建SQL时对值使用<CFQueryParam>
。类似下面的代码应该做的事情:
<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>
答案 1 :(得分:1)
插入多个记录的另一种简单方法是INSERT .. SELECT
。 (在banyr发布的链接中也提到了)。由于技能ID存储在另一个表中,因此您可以使用IN
子句来SELECT
。然后使用简单查询将这些值直接插入到另一个表studenSkill
中,而不是循环。
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">
BTW,如果不是拼写错误,请不要忘记查询列名称周围的#符号,即“skillid”
<input type="checkbox" name="skillid" value="#skillid#" checked="checked">