3

所以我正在 vb.net 中编写一个网络应用程序,我发现自己在概念上有点被特定的数据库问题难住了。

本质上,我有 2 个不同的表单“模板”。在其中,用户填写一堆文本字段并提交,然后全部发送到数据库。第二个模板是相同的,只是它跟踪一些附加信息,因此它向数据库提交更多信息。我没有使用带有大量重复列的一对表或带有一堆空值的单个表,而是创建了一个表来跟踪两个模板共享的所有信息,另一个表存储第二个模板的所有“额外内容”拥有。

这造成的问题是我需要一种方法将两者中的数据配对在一起,以便搜索表单,然后将信息从数据库中提取出来。集合形式由代理自动递增键标识,该键是“共享”表的主键。我试图与“额外的东西”表建立外键关系,但这样做在应用程序端引发了一个问题,我不确定如何处理在我的插入语句中引用自动增量的外键。

举一个代码示例:

    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 不匹配。

关于如何处理它的任何想法?这话有点棘手,所以如果您需要澄清任何事情,请告诉我,我会尽力澄清。

4

1 回答 1

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:这是与您的原始问题不同的问题,但是 FWIW 您应该学习使用查询参数,而不是将表单字段与字符串连接串在一起。使用参数更容易、更快、更安全。

于 2013-09-16T19:56:24.663 回答