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();
rowsile (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 :
nextvalHerhangi 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 Table1manuel olarak çağrılan bir INSERT tetikleyicisi varsa nextval()veya daha büyük olasılıkla, bir SERIALveyaBIGSERIAL 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_seqnerede tve csütun adı olarak adlandırılır, ancak her zaman girip şunu psqlsö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 .