Вставить первичный ключ основной таблицы в дочернюю таблицу несколько раз

Я имею 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 использовать для этого, и продемонстрировать, как использовать его, предоставив небольшой псевдокод?

Я понимаю, что мое описание проблемы может сбить с толку, поэтому, если вам нужны дополнительные разъяснения, оставьте комментарий, и я отредактирую свой пост.

Спасибо.

С наилучшими пожеланиями.

2 ответа

Решение

Да, вы хотите использовать SELECT @@IDENTITY как многопользовательский безопасный способ получения последнего созданного значения AutoNumber (иногда называемого "IDENTITY"). Вещи, которые нужно помнить:

  • Вы выполняете SELECT @@IDENTITY запрос сразу же после выполнения INSERT для родительской таблицы.
  • Вы сохраняете возвращенное значение в 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

Если Object_PK является предсказуемым, например, вы используете поле Autonumber, вы можете сначала определить следующий ключ, например: SELECT Max([Object_ID]+1) AS NewKey FROM ObjectTable; затем используйте это для всех других таблиц (или просто получите значение ключа MAX после сохранения объекта); Как определяется первичный ключ?

Другие вопросы по тегам