2008-09-29 46 views
11

SQL'de, bir tabloyu güncelleştirme, her satır için bir sütunu farklı bir değere ayarlama?PostgreSQL dizisi kullanarak SQL'deki benzersiz değerler nasıl güncellenir?

PostgreSQL veritabanındaki bazı satırları güncellemek istiyorum, bir sütunu bir sıradan bir sayıya ayarlayarak, bu sütunun benzersiz bir kısıtlaması vardır. Ben sadece kullanabilirsiniz ümit:

update person set unique_number = (select nextval('number_sequence')); 

ama nextval yalnızca bir kez denir, bu yüzden güncelleme her satır için aynı numarayı kullanır gibi görünüyor, çünkü 'yinelenen anahtar benzersiz kısıtlamayı ihlal' olsun hata . Bunun yerine ne yapmalıyım?

cevap

28

doğrusu böyle, doğrudan nextval işlevini kullanın subselect kullanmayın:

update person set unique_number = nextval('number_sequence'); 
+0

Teşekkürler - bu işe yarıyor. Alt seçim tarafından yakalandım çünkü iki sütun için aynı sıra numarasını kullanmaya çalışıyordum, ama gerçekten bunu yapmaya ihtiyacım yok. –

+0

Eğer nextval ('dizi') çağırdıktan sonra aynı dizi değerini tekrar kullanmak isterseniz, geçerli diziyi döndüren ilgili işlev akımını ('sıra') kullanabilirsiniz. – cms

0

Ben sf dizileri artan tamsayılar anahtar sıralar en iyi yolu değildir kesmek ve işaretler düşünün. pgsql 8,3

http://www.postgresql.org/docs/8.3/interactive/datatype-uuid.html

kadar UUID için yerel destek alamadım rağmen UUID faydaları kombinasyonu bir çarpışma bir gün vuracak bir rasgele sayı aksine, neredeyse sonsuz olmasıdır.

+0

"Neredeyse sonsuz mu?" Dokümanlar, 128 bitlik bir tamsayı türü olduğunu söylüyor. Bu çok, ama sonsuz değil ve tüm 2^128 değerleri kullanılmadan önce çarpışmak neredeyse kesin. Ayrıca, ORM'lerin bunu kullanmak için dize türlerine/dize dönüştürmesi gerekecektir. Görüşümde net bir kazanç değil. – wberry

+2

2^128'nin ne kadar büyük olduğunu tahmin edersiniz, Wikipedia'da uuid hakkında bilgi edinin. – TravisO

+0

Çoğunlukla akademik, ancak Postgres dizisi, nasıl oluşturulduğuna bağlı olarak bir UUID'den daha çarpışmaya dayanıklı olabilir. Python'un uuid modülü rasgele bir bileşen kullanır, ancak 128'den az rastgele bit kullanır. Sıralar sadece döngü yaparlarsa çarpışırlar, rastgele sayılar rasgele çarpışır. – wberry

İlgili konular