SORU
31 Mayıs 2010, PAZARTESİ


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
31 Mayıs 2010, PAZARTESİ


( 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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • André Frizzo

    André Frizz

    16 Aralık 2006
  • Rockstar Games

    Rockstar Gam

    17 ŞUBAT 2006
  • FF Radioo

    FF Radioo

    14 ŞUBAT 2007