Saya menulis pekerjaan untuk mengubah data dari desain lama menjadi desain baru. Dalam proses ini, saya perlu mengambil id dari sisipan ke tabel terpisah dan menggunakannya dalam sisipan ke tabel target, seperti:
CREATE TABLE t1 {
t1_id BIGSERIAL,
col1 VARCHAR
};
CREATE TABLE t2 {
t2_id BIGSERIAL,
col2 VARCHAR, -- renamed from col1 to avoid confusion
t1_id BIGINT REFERENCES t1.t1_id
};
Saya memiliki SQL yang didefinisikan yang cocok dengan formulir berikut:
WITH ins AS (
INSERT INTO t1 (t1_id) VALUES (DEFAULT) RETURNING t1_id
) INSERT INTO t2
(col1, t1_id)
SELECT
a.val1, (SELECT * FROM ins)
FROM t3 a;
Saya ingin ini untuk menjalankan SELECT * FROM ins
untuk setiap baris SELECT
.. tetapi alih-alih hanya menjalankannya sekali dan menggunakan nilai itu untuk semua baris di SELECT
. Bagaimana saya bisa merestrukturisasi SQL saya untuk mendapatkan perilaku yang diinginkan?
sunting4
t1 akhirnya tampak seperti:
1,<NULL>
(1 row)
t2 akhirnya tampak seperti:
10,'a',1
11,'b',1 -- problem with id from t1 being 1
12,'c',1 -- problem with id from t1 being 1
.
.
Apa yang saya ingin t1 terlihat seperti:
1,<NULL>
2,<NULL>
3,<NULL>
.
.
Apa yang saya ingin t2 terlihat seperti:
10,'a',1
11,'b',2 -- id from t1 of 2
12,'c',3 -- id from t1 of 3
.
.
sunting Untuk mengatasi apa yang dikatakan a_horse_with_no_name, saya juga mencoba ini (dengan hasil yang sama):
WITH ins AS (
INSERT INTO t1 (t1_id) VALUES (DEFAULT) RETURNING t1_id
) INSERT INTO t2
(col1, t1_id)
SELECT
a.val1, b.t1_id
FROM t3 a
JOIN ins b ON TRUE;
sunting2
Saya baru saja mencoba mereferensikan yang sesuai SEQUENCE
dengan permintaan saya, dan itu TIDAK berfungsi - tapi saya tidak terlalu menyukai solusi itu (kebanyakan karena saya tidak suka nama objek yang sulit dikodekan). Jika ada solusi APA PUN lainnya daripada langsung merujuk nama SEQUENCE
saya akan sangat menghargainya. :)
sunting3
Saya kira solusi lain adalah dengan menggunakan a PROCEDURE
untuk melakukan INSERT
bukan CTE .. tapi saya masih menghargai opsi / saran.
sumber
ins
dant3
t1
dan tidak memberikan nilai apa pun untukt1.col1
. Di mana seharusnya data datang untuk kolom itu? Apakaht1.col1
terkait dengant2.col1
?INSERT INTO t1 (t1_id) VALUES (DEFAULT)
hanya memasukkan 1 baris ke dalamt1
. Jadi tidak masalah jika Anda meletakkanins
diFROM
klausa dan bergabung ket3
atau tidak. Bisakah Anda menunjukkan kepada kami bagaimana Anda akan memasukkan 2 (atau lebih) baris ke dalamt1
? Dan yang lebih penting, bagaimana Anda tahu yang mana dari 2 (atau lebih)t1.id
nilai yang akan cocok dengan baris yang dimasukkant2
?Jawaban:
Saya tidak mengerti mengapa Anda membutuhkan 2 tabel jika hanya memiliki 1-1 hubungan. Tapi ini dia (
pk
adalah kunci utamat3
):Jika t3 Anda adalah hasil SELECT alih-alih tabel yang sudah ada, Anda bisa mengimplementasikannya sehingga Anda tidak perlu mengulangi permintaan t3 dua kali:
sumber
t2_id
sama sekali. Sepertinya Anda bisa menggunakant2(t1_id)
PKt2
.ERROR: syntax error at or near "DEFAULT" LINE 2: DEFAULT AS contact_detail_id
DEFAULT
tidak bisa seperti itu. Atau mengembalikant.pk