Böyle bir şey mümkün mü?
INSERT INTO Table2 (val)
VALUES ((INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id));
birinci tabloya bir başvuru ile ikinci bir tabloya bir satır eklemek için dönüş değerini değer olarak kullanmak gibi?
Böyle bir şey mümkün mü?
INSERT INTO Table2 (val)
VALUES ((INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id));
birinci tabloya bir başvuru ile ikinci bir tabloya bir satır eklemek için dönüş değerini değer olarak kullanmak gibi?
Yanıtlar:
Postgres 9.1'den başlayarak bunu yapabilirsiniz:
with rows as (
INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id
)
INSERT INTO Table2 (val)
SELECT id
FROM rows
Bu arada, sadece id ile ilgileniyorsanız, bunu bir tetikleyici ile yapabilirsiniz:
create function t1_ins_into_t2()
returns trigger
as $$
begin
insert into table2 (val) values (new.id);
return new;
end;
$$ language plpgsql;
create trigger t1_ins_into_t2
after insert on table1
for each row
execute procedure t1_ins_into_t2();
rows
ile (some_query returning ...)
günümüzde kudreti çalışması (denemedim).
Bu durum için en iyi uygulama. Kullanın RETURNING … INTO
.
INSERT INTO teams VALUES (...) RETURNING id INTO last_id;
Bunun PLPGSQL için olduğunu unutmayın
RETURNING ... INTO
.
Denis de Bernardy'nin verdiği cevap doğrultusunda ..
İd'nin daha sonra da döndürülmesini istiyorsanız ve Tablo2'ye daha fazla şey eklemek istiyorsanız:
with rows as (
INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id
)
INSERT INTO Table2 (val, val2, val3)
SELECT id, 'val2value', 'val3value'
FROM rows
RETURNING val
Şu lastval()
işlevi kullanabilirsiniz :
nextval
Herhangi bir dizi için en son elde edilen dönüş değeri
Yani bunun gibi bir şey:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (lastval());
nextval()
INSERT'leriniz arasında kimse başka herhangi bir sekansı (mevcut oturumda) aramadığı sürece bu iyi çalışacaktır.
As Denis aşağıda belirtildiği ve ben kullanarak yaklaşık yukarıda uyardı lastval()
başka dizi ile erişebilecekleri ise sorun içine alabilirsiniz nextval()
senin ınsert'ler arasında. Bu , bir dizide Table1
manuel olarak çağrılan bir INSERT tetikleyicisi varsa nextval()
veya daha büyük olasılıkla, bir SERIAL
veyaBIGSERIAL
birincil anahtarı olan bir tablo üzerinde bir INSERT yaptıysa olabilir . Eğer gerçekten paranoyak olmak istiyorsanız (iyi bir şey, onlar o zaman kullanabilirsiniz, gerçekten sonuçta seni almak için vardır) currval()
ancak ilgili dizisinin ismini öğrenmek gerekir:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (currval('Table1_id_seq'::regclass));
Otomatik olarak oluşturulan sıra genellikle tablo adı t_c_seq
nerede t
ve c
sütun adı olarak adlandırılır, ancak her zaman girip şunu psql
söyleyerek öğrenebilirsiniz :
=> \d table_name;
ve sonra söz konusu sütun için varsayılan değere bakın, örneğin:
id | integer | not null default nextval('people_id_seq'::regclass)
Bilginize: lastval()
aşağı yukarı MySQL'in PostgreSQL sürümüdür LAST_INSERT_ID
. Bunu sadece söylüyorum çünkü pek çok insan MySQL'e PostgreSQL'den daha aşinadır, bu yüzden lastval()
tanıdık bir şeyle bağlantı kurmak bazı şeyleri açıklığa kavuşturabilir.
lastval
şu ki , Table1'deki bir AFTER INSERT tetikleyicisinden arkanızda sıraya dayalı bir INSERT olabilir. Bu, mevcut seansta olacak ve muhtemelen lastval()
beklemediğinizde değişecektir .