我有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, ... >
以下是应该让事情更清晰的图片:
我使用ADO
和C++
来插入数据。
首先,我需要输入主表Object
的数据。我可以使用INSERT
查询成功完成此操作。
我的问题如下:
完成上述操作后,我需要将Object
的主键插入子表中,因为它是它们的外键。
请允许我准确描述我的需求,以便社区可以帮助我:
正如我所说,首先我将数据插入主表Object
。
然后我需要将数据和Object
的主键插入子表中。
浏览互联网我发现@@IDENTITY
可能对我有帮助,但我不知道它是否适用于我的情况。
为了更加努力,这将在for loop
中完成(Object_PK
的值在每个INSERT
中都相同,并且等于的最后值插入记录为Object
),如下所示:
for ( //... )
L"INSERT INTO Electric_Consumption ( Object_PK, field1, field2 ... )
values ( Object_pk // should I use here @@IDENTITY ? );
然后对表Water_Consumption
和Educational_Object
重复同样的事情。
完成此操作后,我需要在Educational_Object
的子表中添加数据。
与上述相同,我只需要添加Object_PK
而不是Educational_Object_PK
。
以下是更好地澄清事物的伪代码:
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
,并通过提供一个小的伪代码演示如何使用它?
我理解我对问题的描述可能会令人困惑,所以如果您需要进一步澄清,请留言,我会编辑我的帖子。
谢谢。
最好的问候。
答案 0 :(得分:1)
是的,您希望使用SELECT @@IDENTITY
作为多用户安全方式来检索最近创建的自动编号(有时称为“IDENTITY”)值。要记住的事情是:
SELECT @@IDENTITY
查询。Long Integer
变量中。以下是VBA代码,但您可以将其视为伪代码:
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 :(得分:0)
如果Object_PK是可预测的,例如您正在使用自动编号字段,则可以先通过以下方式确定下一个键: SELECT Max([Object_ID] +1)AS NewKey FROM ObjectTable; 然后将其用于所有其他表(或者只是在存储Object后检索MAX键值);如何定义主键?