Postgresql son eklenen id için işlev
Nasıl son numarası bir tablo içine alabilirim? INSERT deyim var MS SQL().
Lütfen, böyle bir şey kullanın: tavsiye değil
select max(id) from table
CEVAP
( tl;dr
: git seçenek 3: DÖNEN EKLE )
Postgresql "tablo kavramı, sadece." kimliği yoktur hatırlama ^strong>dizilerigenellikle ama mutlaka yedek birincil anahtarları için varsayılan değer olarak kullanılan değil, SERIAL ile sahte bir türü olan).
Eğer yeni eklenen satırın id almak ilgilenen varsa, birkaç yolu vardır:
Seçenek 1: CURRVAL(<sequence name>);
.
Örneğin:
INSERT INTO persons (lastname,firstname) VALUES ('Smith', 'John');
SELECT currval('persons_id_seq');
Adı sırası olmalı bilinen, çok keyfi; Bu örnekte galiba bu Tablo persons
id
sütun ile SERIAL
sözde yazın. Bu dayanarak ve daha temiz hissetmek önlemek için, pg_get_serial_sequence
yerine kullanabilirsiniz:
INSERT INTO persons (lastname,firstname) VALUES ('Smith', 'John');
SELECT currval(pg_get_serial_sequence('persons','id'));
currval()
INSERT
nextval()
konulan () sonra çalışır . uyarı: ^strong>aynı oturumda.
Seçenek 2: LASTVAL();
Sıra numarası belirtmenize gerek yok ki bu önceki benzer, sadece: en son değiştirilme sırası (her zaman yukarıdaki gibi oturum, aynı uyarı içinde) arar.
CURRVAL
LASTVAL
eşzamanlı hem de tamamen güvenlidir. Bu davranış dizisi PG tasarlanmış böylece farklı oturum olacak karışmaz, Bu yüzden risk yok yarış koşulları (eğer başka bir oturum ekler başka bir satır arasında benim ve benim EKLE SEÇİN, ben hala benim doğru değer).
Ancakince potansiyel bir sorun var. Eğer veritabanına sahip bazı TRIGGER (ya da KURAL), ekleme içine persons
tablo yapar, bazı ekstra eklemeler diğer tablolar... LASTVAL
muhtemelen bize yanlış değer. Sorun bile ekstra eklemeler persons
aynı tablo (bu çok daha az olağandır, ama risk hala var) intto yapılmazsa CURRVAL
ile gerçekleşebilir.
Seçenek 3: RETURNING
32*
INSERT INTO persons (lastname,firstname) VALUES ('Smith', 'John') RETURNING id;
Bu kimliği almak için en temiz, verimli ve güvenli yoludur. Önceki herhangi bir risk yok.
Sakıncaları? Neredeyse hiçbiri: ihtiyacın olabilir değiştirmek için yolu senin arama INSERT deyimi (en kötü durumda, belki de API veya DB katman beklemez bir EKLEME için bir dönüş değeri); değil standart SQL (kimin umurunda); var kullanılabilir beri Postgresql 8.2 (Aralık 2006...)
Sonuç: Eğer yapabiliyorsanız, seçenek 3. Başka bir yerde, 1 tercih.
Not: tüm bu yöntemler, Eğer almak istiyorsanız . işe yaramaz ^strong>küresel eklenen son kimlik(mutlaka oturumunuzda). Bunun için, select max(id) from table
(tabii ki, bu diğer işlemler kaydedilmemiş ekler okumazlar) başvurmak gerekir.
JavaScript bir işlev için varsayılan p...
Nasıl PostgreSQL komut satırı yardımcı...
En iyi eklenen satırın kimliği almak i...
Kaydet CSV dosyası için PostgreSQL/Pos...
Değişken ve işlev adları için Python a...