Gunakan CTE pengubah data untuk mengikat tiga INSERT Anda. Sesuatu seperti ini:
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;
-
Biasanya yang terbaik adalah menambahkan daftar definisi kolom untuk
INSERT
s (kecuali untuk kasus khusus). Jika tidak, jika struktur tabel berubah, kode Anda mungkin rusak dengan cara yang mengejutkan. -
Saya menghilangkan kolom di mana Anda hanya akan memasukkan
DEFAULT
. Default dimasukkan secara otomatis. Lebih pendek, hasil yang sama. -
RETURNING
final opsional mengembalikanuser_id
. yang dihasilkan - jelas dari urutan atau default lainnya. Ini sebenarnyauser_id
daritable3
, tapi itu sama kecuali Anda memiliki beberapa pemicu atau sihir lain yang mengganggu.
Lebih lanjut tentang CTE pengubah data (alias "dapat ditulis"):
- Apakah kueri jenis SELECT satu-satunya jenis yang dapat disarangkan?