From: | "N(dot) Can KIRIK" <can(at)epati(dot)com(dot)tr> |
---|---|
To: | Zafer Çelenk <zafercelenk(at)gmail(dot)com> |
Cc: | "pgsql-tr-genel(at)postgresql(dot)org" <pgsql-tr-genel(at)postgresql(dot)org> |
Subject: | Re: [pgsql-tr-genel] Otomatik artan alan tanımı |
Date: | 2016-02-01 11:52:51 |
Message-ID: | CAJ1wP5kyTczcFS0+iEtauDY2pez8=q--4Y=Q0Xppz3adH_6RUA@mail.gmail.com |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-tr-genel |
Merhaba,
PostgreSQL'de aslında SERIAL diye bir alan türü yok. Serial otomatik
şekilde SEQUENCE oluşturmak için kullanılan bir kısayoldan ibaret. Serial
tanımı içeren bir alan ile tablo oluşturduğunuz zaman "notice" seviyesinde
bir uyarı ile "sequence" oluşturulduğu bilgisini size verir. Alan türünü
INT'e çevirir ve varsayılan olarak oluşturduğu sequence'in sıradaki
değerini alacak şekilde bir tanım yapar : nextval('test_id_seq'::regclass").
Bu şekilde siz ilgili alana birşey kaydetmezseniz varsayılan değer olarak
sequence'den yeni bir değer alır. Böylece her kayıt için farklı bir
değeriniz olur. Başarısız kayıt eklemeler sonucunda sayılar arasında
boşluklar kalabilir. Bu bilinen ve istenen bir davranıştır ki aksi takdirde
tutarsızlıklar ortaya çıkabilir.
Her kayıt için ayrı bir değer olması bakımından sequence barındıran
alanları primary key yapmak mantıklı bir tercih olacaktır.
Diğer taraftan veritabanında yaptığınız her işlem sonunda hata olabilir.
Hatalardan kaçınmak ve bu şekilde veri tutarlılığını kaybetmek yerine,
yazılımınızda tüm işlemler sonunda dönebilecek hatalara göre uygulamanızın
akışını yönlendirmek daha doğru olacaktır. Yani bir işlem sonunda hata
almak sandığınız gibi kötü birşey değil aksine istediğimiz şey
"istemediğimiz" bir durum olduğunda veritabanının veriyi kabul etmeyip bize
dönüş yapması.
Kullanıcının elle giriş yapması yerine, her seferinde SELECT NEXTVAL(
'test_id_seq'::regclass ) ile sıradaki değeri alıp bu değeri arayüzde
salt-okunur olarak gösterip kaydetme işlemi sırasında kullanabilirsiniz.
Önceden de belirttiğim gibi arada oluşacak boşluklara kafayı takmayın.
Değeri göstermeniz gerekmiyorsa sıradan değer alma işlemini veritabanına
bırakın.
Kullanıcının veritabanına doğrudan kayıt eklemesini mutlaka
engellemelisiniz. Siz arayüz tarafında bahsettiğiniz "engeli"
uygulamalısınız.
*N. Can KIRIKePati Bilişim Teknolojilerihttp://www.epati.com.tr/
<http://www.epati.com.tr/>*
2016-02-01 9:50 GMT+02:00 Zafer Çelenk <zafercelenk(at)gmail(dot)com>:
> Merhaba,
>
> PostgreSQL tablom üzerinde "serial" tipini kullanarak "id" isimli otomatik
> artan alan oluşturdum. Gayet güzel çalışıyor ama beklediğimden
> farklı bir davranış gösteriyor. Bununla ilgili iki sorum olcak;
>
> 1. Tabloya elle bir kayıt girdiğimde ve id değerini ben verdiğimde sistem
> kayıtı ve benim verdim id değerini kabul edip işlemi gerçekleştiriyor.
> Ancak sistem sayıları arttırırken aynı sayıya ulaşınca benim verdiğim
> numaranın aynısını tekrar veriyor ve bu kayıtta sisteme eklenyor. Bu
> durumda aynı id değeri olan iki kayıt oluşmuş oluyor. Diğer taraftan alan
> primary key olarak tanımlanabilir ancak bu seferde böyle bir durumda hata
> veriyor.
>
> Benim istegim ya kullanıcının otomatik artan alana giriş yapamaması yada
> numara zaten sistemde mevcutsa bir sonrakine atlanması bunu nasıl
> yapabilirim?
>
> 2. Tablo tanımında alanı serial olarak tanımlasamda pgAdmin üzerinden
> create kodlarına baktığımda tipi integer olarak görüyorum ve satıra şöyel
> bir tanım ekleniyor "nextval('test_id_seq'::regclass" bu kodla tabloyu
> create etmek istediğimde ise "relation "test_id_seq" does not exist" hatası
> alıyorum. Bu durumun sebebi nedir ve bu işin doğrusu nasıl olmalıdır.
>
> Zafer.
>
From | Date | Subject | |
---|---|---|---|
Next Message | Zafer Çelenk | 2016-02-01 13:43:14 | Re: Otomatik artan alan tanımı |
Previous Message | Uygar UZUNHASAN | 2016-02-01 09:08:10 | Re: Otomatik artan alan tanımı |