1

嗨,我在多个表中插入数据时遇到问题。我已经在表中定义了主键和引用键现在我想在单个查询中在两个表中插入数据.......我该怎么做............????? ??

4

4 回答 4

4

您的问题并不清楚具体问题是什么。我可以看到三种可能性:
1. 你想用一个 INSERT 语句插入两个表
2. 你想做两次插入,但没有其他任何东西能够“进入中间”
3. 你想插入一个表,然后获取要插入第二个表的主键


1.的答案很简单:

You can't.


2. 的答案也很简单:

BEGIN TRANSACTION
   INSERT INTO <table1> (a,b,c) VALUES (1,2,3)
   INSERT INTO <table2> (a,b,c) VALUES (1,2,3)
COMMIT TRANSACTION


3. 的答案有几种可能性。每个都取决于您想要做什么。很可能您想使用SCOPE_IDENTITY()但您可能还想查找@@identityIDENT_CURRENT()以了解各种不同的选项和复杂性。

BEGIN TRANSACTION

   INSERT INTO <dimension_table> (name)
      VALUES ('my new item')

   INSERT INTO <fact_table> (item_id, iteam_value)
      VALUES (SCOPE_IDENTITY(), 1)

COMMIT TRANSACTION
于 2009-08-22T12:18:28.290 回答
1

这就是交易的意义所在。标准 SQL 不允许将单个语句一次插入多个表。正确的做法是:

-- begin transaction
insert into table 1 ...
insert into table 2 ...
commit
于 2009-08-22T08:51:31.050 回答
0

您选择的其中一种方法是使用 ORM(如 Hibernate、NHibernate),您可以创建对象并设置与它的其他关系,最后只需保存主要对象,例如:

A a;
B b;
C c;
a.set(b);
a.set(c);
DAO.saveOrUpdate(a);

你必须注意你的 DAO.saveOrUpdate(a); 代码行只适用于休眠,但它将数据插入到 3 个表 A、B、C 中。

于 2009-08-22T09:17:48.220 回答
0

您的语言是否支持 INSERT ALL 结构?如果是这样,这是最好的方法。事实上,这是唯一的方法。我在另一个 SO 线程中发布了此构造的示例(该示例语法来自 Oracle SQL)。

另一种选择是构建一个事务性存储过程,该过程将一条记录插入主键表,然后将一条记录插入引用表。

于 2009-08-22T08:34:46.760 回答