我有两个表,其公共字段是Load_ID。第一个的PK与第二个的FK有一对多的关系。例如:
Table1:
1, someValue
Table2:
1, value1, ...
1, value2, ...
1, value3, ...
我已经在ASP.NET类中嵌入了实际的insert语句,其中的值来自用户输入:
"INSERT INTO Compare_Header_Table VALUES
(compare_sequence.nextval, //other values are inserted here)
我用来自动增加PK的序列是CREATE SEQUENCE compare_sequence;
即使没有创建触发器或指定任何参数,这似乎也可以工作,因为序列默认为增量1和初始值1,这对我来说很好。
我遇到问题的地方是尝试将FK从第二个表格链接到第一个表格的PK。我不能简单地使用compare_sequence.currval
因为我有一个单独的方法插入每个表,所以我每次都创建一个新的连接。我不想将这些结合到一个方法中,因为这将涉及改变我的C#类的逻辑结构,我宁愿保持原样。
有关如何使这项工作的任何建议?
答案 0 :(得分:3)
您可以使用RETURNING cause获取指定值:
INSERT INTO Compare_Header_Table (ID) VALUES
(compare_sequence.nextval)
returning id into some_value;
这个some_value
是一个局部变量,您需要从第一个类中传递出来并转到第二个类。你这样做的准确程度取决于你的架构。
顺便提一下,我希望当你说'我每次创建一个新的连接'时,这是一些c#行话,而你每次都没有真正创建新的数据库连接。因为这是一项非常昂贵的操作。
另一件事是,如果你在不同的会话中创建父和子记录会发生什么事务?您必须提交每个插入(否则当您尝试插入子项时,新的父记录将不会对外键验证可见)。
答案 1 :(得分:1)
如果您希望在单独的会话中完成INSERT
操作,则需要从第一个语句中检索生成的密钥,并将其传递给将数据插入table2
的方法。在不需要数据库往返的情况下检索生成的密钥的一种方法是执行类似
INSERT INTO compare_header_table
VALUES( compare_sequence.nextval,
... )
RETURNING name_of_primary_key_column
INTO :bind_variable