У меня есть две таблицы, в которых информация передается друг от друга, каждая с целочисленным первичным ключом.
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
.