Эффективный способ перекрестной ссылки первичных ключей во время транзакций базы данных - PullRequest
0 голосов
/ 01 мая 2020

У меня есть две таблицы, в которых информация передается друг от друга, каждая с целочисленным первичным ключом.

CREATE TABLE tbl1
(
    id_1 INTEGER NOT NULL PRIMARY KEY,
    id_from INTEGER,
    value1 FLOAT
);

CREATE TABLE tbl2
(
    id_2 INTEGER NOT NULL PRIMARY KEY,
    id_from INTEGER,
    value2 FLOAT
);

Я намерен вставить значения для этих таблиц, учитывая, что id_1 и id_2 являются первичными ключами, мне не нужно указывать их при вставке. Но в этой транзакции я хотел бы сохранить соответствующие значения идентификаторов вновь вставленных строк в другой таблице.

BEGIN TRANSACTION

    INSERT INTO tbl1 (id_from, value1) VALUES (@@IDFROM2, 200)
    INSERT INTO tbl2 (id_from, value2) VALUES (@@IDFROM1, -200)

COMMIT TRANSACTION;

Один из способов сделать это - вставить значения в первую таблицу, извлекает его первичный ключ, вставляет значения во вторую таблицу, извлекает его первичный ключ и возвращает его к обновлению строки в первой таблице:

DECLARE @insert_id1 AS INTEGER
DECLARE @insert_id2 AS INTEGER

BEGIN TRANSACTION
    INSERT INTO tbl1(value1) VALUES (200)

    SET @insert_id1 = SELECT MAX(id_1) FROM tbl1

    INSERT INTO tbl2(id_from, value2) VALUES (@insert_id, -200)

    SET @insert_id2 = SELECT MAX(id_2) FROM tbl2

    UPDATE tbl1
    SET from_id = @insert_id2 
    WHERE id_1 = @insert_id1

COMMIT TRANSACTION;

Однако мне интересно, есть ли более прямой путь сделать это без необходимости хранить идентификаторы с операторами SELECT MAX, так как кажется, что это может привести к ошибкам. У меня есть догадка, что это невозможно, но я хотел бы быть уверен в этом.

Obs: причина, по которой столбец id_from в каждой таблице не является внешним ключом, заключается в том, что в конечном итоге он будет использоваться для хранения информации из большего количества таблиц, а не только между tbl1 и tbl2.

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