因此,我正在用vb.net编写一个web应用程序,我发现自己在概念上遇到了一个特定的数据库问题。
本质上,我对一个表单有两个不同的“模板”。在一种情况下,用户填充一堆文本字段并提交它,然后将其全部发送到数据库。第二个模板是相同的,只是它跟踪了一些附加信息,因此它向数据库提交了更多的信息。与其有一对列重复的表或一个表中有一串空值,我还创建了一个表来跟踪两个模板共享的所有信息,另一个表存储了第二个模板所拥有的所有“额外内容”。
它所造成的问题是,我需要一种方法,将两个数据组合在一起,以便搜索表单,然后从数据库中提取信息。集体形式由代理项自动递增键标识,它是“共享”表的主键。我试图用“额外的东西”表建立一个外键关系,但是这样做在应用程序端引发了一个问题,我不知道如何处理引用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 + ", '" + _
")"在第一个insert语句中,我将所有共享信息插入到“共享”表中。我不必担心这里的自动增量,因为它都是由数据库处理的。第二个insert语句将所有额外的内容都放入“Extern外between”表中,但是我不能在不计算出要放入外键的情况下插入所有这些东西,因为为了在这两组数据之间建立关系,它不可能是空的。我操作的印象是,只要将外键设置为AI,它就会在"1“重新开始,它将与由”共享“表生成的AI不匹配。
关于如何处理它,有什么想法吗?这是有点棘手的话,所以如果你需要澄清任何事情,让我知道,我会尽我最大的努力来澄清它。
发布于 2013-09-16 19:56:24
处理这个问题的标准方法是第二个表不将其主键声明为自动增量。相反,必须在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:这是一个与原来的问题不同的问题,但是FWIW您应该学会使用查询参数,而不是用字符串连接将表单字段串在一起。使用参数更容易、更快、更安全。
https://stackoverflow.com/questions/18835849
复制相似问题