Използвайте CTE за модифициране на данни да верижите вашите три INSERT. Нещо като това:
WITH ins1 AS (
INSERT INTO table1 (username, name, surname)
VALUES ('johnee','john','smith')
RETURNING user_id
)
, ins2 AS (
INSERT INTO table2 (user_id, password)
SELECT ins1.user_id, 'secret'
FROM ins1 -- nothing to return here
)
INSERT INTO table3 (user_id, adress, city, phone)
SELECT ins1.user_id, ...
FROM ins1
RETURNING user_id;
-
Обикновено е най-добре да добавите списък с дефиниции на колони за
INSERT
s (с изключение на специални случаи). В противен случай, ако структурата на таблицата се промени, кодът ви може да се счупи по изненадващи начини. -
Пропуснах колони, където просто трябва да въведете
DEFAULT
. Настройките по подразбиране се вмъкват автоматично. По-кратко, същият резултат. -
Окончателното, незадължително
RETURNING
връща полученияuser_id
- очевидно от последователност или някаква друга по подразбиране. Това всъщност еuser_id
отtable3
, но това е същото, освен ако нямате някакви задействания или друга магическа намеса.
Повече за CTE-то за модифициране на данни (известно още като "записваеми"):
- Заявките от тип SELECT ли са единственият тип, който може да бъде вложен?