所以我在vb.net上写了一个web应用程序,我发现自己在概念上遇到了一个特定的数据库问题。
基本上,我有一个表单的2个不同的“模板”。在一个用户中,用户填写一堆文本字段并提交它,并将其全部发送到数据库。第二个模板是相同的,除了它跟踪一些额外的信息,因此它提交更多的数据库。我创建了一个表来跟踪两个模板共享的所有信息,而另一个表存储了所有“额外的东西”第二个模板,而不是一对包含大量重复列的表或一个包含一堆空值的表。具有
这就产生了一个问题,我需要一种方法将两个数据放在一起,以便搜索表单,然后将信息从数据库中提取出来。集合表单由代理自动递增密钥标识,代理自动递增密钥是“共享”表的主键。我试图与“额外的东西”表建立外键关系,但这样做引发了应用程序端的问题,我不知道如何处理引用insert语句中的自动增量的外键。
举一个代码示例:
Dim sInsertInto As String
sInsertInto = "INSERT INTO 5why (date, op_id, serial, why1, why2, why3, why4, why5, root_cause, other_notes, lessons, define, template) VALUES (" + _
"'" + f_date + "', " + _
" '" + f_usr + "', " + _
" '" + f_partnum + "', " + _
" '" + f_first + "', " + _
" '" + f_second + "', " + _
" '" + f_third + "', " + _
" '" + f_fourth + "', " + _
" '" + f_fifth + "', " + _
" '" + f_root + "', " + _
" '" + f_notes + "', " + _
" '" + f_lessons + "', " + _
" '" + f_define + "', " + _
" '" + f_temp + "'" + _
")"
Dim sInsertInto2 As String
sInsertInto2 = "INSERT INTO 5why_mbusi (countermeasure, containment, check_it, standardize_counter, point_cause, method_procedure, group_leader, engineer, shop_am, shop_manager) VALUES (" + _
"'" + f_counter + "', " + _
" '" + f_containment + "', " + _
" '" + f_check + "', " + _
" '" + f_standardCounter + "', " + _
" '" + f_pointOfCause + "', " + _
" '" + f_methodAndProc + "', " + _
" '" + f_groupLeader + "', " + _
" '" + f_engineer + "', " + _
" '" + f_shop_A_M + "', " + _
" '" + f_shopManager + ", '" + _
")"
在第一个插入语句中,我将所有共享信息插入“共享”表中。我不必担心这里的自动增量,因为它全部由数据库处理。第二个插入语句将所有附加内容发送到“额外的东西”表中,但是我不能插入所有这些内容而不计算要放入外键的内容,因为它不能为了建立关系而为空两组数据之间。我的印象是,只需将外键设置为AI,只需将其重新设置为“1”,它就不会与“共享”表生成的AI相匹配。
有关如何处理它的任何想法?这有点棘手,所以如果你需要澄清任何事情,请告诉我,我会尽力清理它。
答案 0 :(得分:2)
处理此问题的标准方法是,第二个表不将其主键声明为自动增量。相反,您必须在INSERT语句中指定主键的值。
如果在第一个表之后立即插入第二个表,则可以使用特殊函数LAST_INSERT_ID()作为值。
示例:
INSERT INTO table1 (foo) VALUES (1234); -- generates a new `id`
INSERT INTO table2 (id, bar) VALUES (LAST_INSERT_ID(), 'abcd');
LAST_INSERT_ID()函数通过先前INSERT语句在同一会话中返回最近生成的自动增量值。在其他会话中进行自己插入的其他人不可能妥协这一点。
PS:这是与原始问题不同的问题,但是您应该学习使用查询参数而不是使用字符串连接将表单字段串联在一起。使用参数更容易,更快速,更安全。