首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多次将主表的主键插入子表

多次将主表的主键插入子表
EN

Stack Overflow用户
提问于 2014-02-07 03:35:32
回答 2查看 184关注 0票数 1

我有具有以下模式的MS Access 2007数据库:

主表Object< # Object_PK, ... >

子表Electric_Consumption< $ Object_PK, # Electric_Consumption_PK, ... >

子表Water_Consumption< $ Object_PK, # Water_Consumption_PK, ... >

子表Educational_Object< $ Object_PK, # Educational_Object_PK, ... >,其子表定义如下:

School< $ Educational_Object_PK, # School_PK, ... >

University< $ Educational_Object_PK, # University_PK, ... >

下面的图片应该让事情变得更清楚:

我使用ADOC++插入数据。

首先,我需要输入主表Object的数据。我可以通过INSERT查询成功地做到这一点。

我的问题是:

在上面的操作之后,我需要将Object主键插入到子表中,因为它是它们的外键。

请允许我准确地描述我需要什么,这样社区才能帮助我:

正如我所说的,首先我将数据插入主表Object中。

然后,我需要将data 主键**插入子表中。

浏览互联网,我发现@@IDENTITY可能对我有帮助,但我不知道它是否适用于我的情况。

更困难的是,这将在for loop中完成( Object_PK的值在每个INSERT中都是相同的,并且等于的值--最后一次插入Object的记录),如下所示:

代码语言:javascript
复制
for ( //... ) 
   L"INSERT INTO Electric_Consumption ( Object_PK, field1, field2 ... ) 
       values ( Object_pk // should I use here @@IDENTITY ? );

然后,对于表Water_ConsumptionEducational_Object也应该重复相同的操作。

完成之后,我需要在Educational_Object的子表中添加数据。

与上面一样,我只需要添加Object_PK而不是Educational_Object_PK

下面是用来更好地澄清事情的伪代码:

代码语言:javascript
复制
L"INSERT INTO Object ( ... ) values ( ... ); //this is OK

for ( ... )
    L" INSERT INTO Electric_Consumption ( Object_PK, ... ) 
        values ( Object_PK, ... )"; // should I use @@IDENTITY here
                                    // to get Object_PK ??
for ( ... )
    L" INSERT INTO Water_Consumption ( Object_PK, ... ) 
        values ( Object_PK, ... )"; // should I use @@IDENTITY here
                                    // to get Object_PK ??
for ( ... )
    L" INSERT INTO Educational_Object ( Object_PK, ... ) 
        values ( Object_PK, ... )"; //  should I use @@IDENTITY here
                                    // to get Object_PK ??
for ( ... )
    L" INSERT INTO School ( Educational_Object_PK, ... ) 
        values ( Educational_Object_PK, ... )";// should I use @@IDENTITY here
                                    // to get Educational_Object_PK ??
for ( ... )
    L" INSERT INTO University ( Educational_Object_PK, ... ) 
        values ( Educational_Object_PK, ... )";// should I use @@IDENTITY here
                                    // to get Educational_Object_PK ??

请您告诉我要使用哪个SQL statement,并演示如何通过提供一个小伪代码来使用它吗?

我知道我对这个问题的描述可能很混乱,所以如果你需要进一步澄清,请留下评论,我会编辑我的帖子。

谢谢。

诚挚的问候。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-07 08:50:55

是的,您希望使用SELECT @@IDENTITY作为一种多用户安全的方法来检索最近创建的AutoNumber (有时称为“标识”)值。要记住的事情是:

  • 在对父表执行插入后立即执行SELECT @@IDENTITY查询。
  • 将返回的值存储在Long Integer变量中。
  • 使用该变量填充子表中的外键值。

以下是VBA代码,但您可以将其视为伪代码:

代码语言:javascript
复制
Dim lngObject_PK As Long, lngEducational_Object_PK As Long

Set cmd = New ADODB.Command
cmd.ActiveConnection = con
cmd.CommandText = "INSERT INTO [Object] ([Description]) VALUES (?)"
cmd.Parameters.Append cmd.CreateParameter("?", adVarWChar, adParamInput, 255, "my new Object")
cmd.Execute
Set cmd = Nothing

Set rst = New ADODB.Recordset
rst.Open "SELECT @@IDENTITY", con, adOpenStatic, adLockOptimistic
lngObject_PK = rst(0).Value
rst.Close
Set rst = Nothing
Debug.Print "Object_PK of newly-created Object record: " & lngObject_PK

Set cmd = New ADODB.Command
cmd.ActiveConnection = con
cmd.CommandText = "INSERT INTO [Electric_Consumption] ([Object_PK],[Description]) VALUES (?,?)"
cmd.Parameters.Append cmd.CreateParameter("?", adInteger, adParamInput, , lngObject_PK)
cmd.Parameters.Append cmd.CreateParameter("?", adVarWChar, adParamInput, 255, "my new Electric_Consumption")
cmd.Execute
Set cmd = Nothing

Set cmd = New ADODB.Command
cmd.ActiveConnection = con
cmd.CommandText = "INSERT INTO [Educational_Object] ([Object_PK],[Description]) VALUES (?,?)"
cmd.Parameters.Append cmd.CreateParameter("?", adInteger, adParamInput, , lngObject_PK)
cmd.Parameters.Append cmd.CreateParameter("?", adVarWChar, adParamInput, 255, "my new Educational_Object")
cmd.Execute
Set cmd = Nothing

Set rst = New ADODB.Recordset
rst.Open "SELECT @@IDENTITY", con, adOpenStatic, adLockOptimistic
lngEducational_Object_PK = rst(0).Value
rst.Close
Set rst = Nothing
Debug.Print "Educational_Object_PK of newly-created Educational_Object record: " & lngEducational_Object_PK

Set cmd = New ADODB.Command
cmd.ActiveConnection = con
cmd.CommandText = "INSERT INTO [School] ([Educational_Object_PK],[Description]) VALUES (?,?)"
cmd.Parameters.Append cmd.CreateParameter("?", adInteger, adParamInput, , lngEducational_Object_PK)
cmd.Parameters.Append cmd.CreateParameter("?", adVarWChar, adParamInput, 255, "my new School")
cmd.Execute
Set cmd = Nothing
票数 1
EN

Stack Overflow用户

发布于 2014-02-07 05:12:37

如果Object_PK是可预测的,比如您使用的是自动编号字段,您可以首先通过如下方式确定下一个键:从ObjectTable中选择Max(Object_ID+1)作为NewKey;然后将其用于所有其他表(或者只是在存储对象之后检索最大键值);主键是如何定义的?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21618823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档