Передать автоматически сгенерированный идентификатор в другую таблицу - PullRequest
1 голос
/ 13 февраля 2020

Поэтому я попытаюсь объяснить мою проблему с псевдокодом. Но прежде всего какое-то объяснение. Я пытаюсь создать простую процедуру в SQL, которая будет вставлять данные в три таблицы, где идентификаторы от table_1 и table_2 должны быть переданы в table_3. Не уверен, как этого добиться. Я использую SQL Сервер.

псевдокод


CREATE PROCEDURE Bla
 @arg VARCHAR(1)
AS
  INSERT INTO table_1 VALUES(...) -- need id from here
  INSERT INTO table_2 VALUES(...) -- and id from here

  INSERT INTO table_3 VALUES (..., table_1_id, table_2_id)

Как вы можете догадаться, эти идентификаторы Foreign Keys в table_3

Итак, я думал о том, чтобы сделать что-то подобное, после того как я INSERT данные в table_1 и table_2


@tab1id = SELECT TOP 1 id from table_1 ORDER BY id DESC
@tab2id = SELECT TOP 1 id from table_2 ORDER BY id DESC

INSERT INTO table_3 VALUES (..., @tab1id, @tab2id)

Но по какой-то причине я не думаю, что это хорошая практика. Поэтому я гуглил и нашел что-то вроде SCOPE_IDENTITY, но не уверен, как правильно его использовать, моя идея сделать что-то вроде:


 INSERT INTO table_1 VALUES(...) 
 @tab1id = SELECT SCOPE_IDENTITY()

 INSERT INTO table_2 VALUES(...)
 @tab2id = SELECT SCOPE_IDENTITY()

 INSERT INTO table_3 VALUES (..., @tab1id, @tab2id)

Но не уверен, что это хорошая идея, пожалуйста, дайте несколько советов .

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Вы на правильном пути.

Как вы можете видеть в принятом ответе по следующей теме c: Лучший способ получить идентификатор вставленной строки? , SCOPE_IDENTITY ( ) возвращает значения из вашей текущей области и сеанса.

Единственное, что мы должны добавить, - это какой-то элемент управления, поэтому мы уверены, что мы не вводим неверную информацию в table_3. На основе вашего кода, пожалуйста, найдите пример тела SP ниже:

    DECLARE @tab1id int
    DECLARE @tab2id int
    DECLARE @ErrorVar int
    DECLARE @RowCountVar int

    BEGIN TRANSACTION

            INSERT INTO table_1 VALUES(...)
            --checking for errors:
            SELECT @ErrorVar = @@ERROR, @RowCountVar = @@ROWCOUNT
            IF (@ErrorVar > 0 OR @RowCountVar < 1)
                BEGIN
                    RAISERROR ('P1: Insert to table table_1 failed', 16, 1)
                    GOTO ErrExit
                END
            SET @tab1id = SCOPE_IDENTITY()

            INSERT INTO table_2 VALUES(...)
            --checking for errors:
            SELECT @ErrorVar = @@ERROR, @RowCountVar = @@ROWCOUNT
            IF (@ErrorVar > 0 OR @RowCountVar < 1)
                BEGIN
                    RAISERROR ('P1: Insert to table table_2 failed', 16, 1)
                    GOTO ErrExit
                END
            SET @tab2id = SCOPE_IDENTITY()

             INSERT INTO table_3 VALUES (..., @tab1id, @tab2id)
             --checking for errors:
            SELECT @ErrorVar = @@ERROR, @RowCountVar = @@ROWCOUNT
            IF (@ErrorVar > 0 OR @RowCountVar < 1)
                BEGIN
                    RAISERROR ('P1: Insert to table table_3 failed', 16, 1)
                    GOTO ErrExit
                END
            --if you need newly created table_3 IDENTITY 
            SET @tab3id = SCOPE_IDENTITY()

    --Normal exit
    COMMIT TRANSACTION

    --Error Exit
    ErrExit:
    ROLLBACK TRANSACTION
0 голосов
/ 13 февраля 2020

Когда первый идентификатор таблицы проходит в других таблицах, вы должны проверить, существует ли идентификатор, затем обновите свою запись, если идентификатор не доступен, затем вставьте свою запись из-за SCOPE_IDENTITY при каждом увеличении идентификатора и сохранении ее. 3 таблица означает внешний ключ.

Когда ваша хранимая процедура выполняется в первый раз, идентификатор также изменится. Идентификатор третьей таблицы также изменится, значит, каждый раз, когда ваш идентификатор будет изменен, вам необходимо проверить, есть ли идентификатор в вашей таблице, а затем обновить свою сохраненную. Процедура и идентификатор не существует в вашей таблице, а затем обновите свою запись.

Установите триггер перед вставкой и убедитесь, что идентификатор существует или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...