Re: Otomatik artan alan tanımı

From: Zafer Çelenk <zafercelenk(at)gmail(dot)com>
To: "pgsql-tr-genel(at)postgresql(dot)org" <pgsql-tr-genel(at)postgresql(dot)org>
Subject: Re: Otomatik artan alan tanımı
Date: 2016-02-01 13:43:14
Message-ID: 1454334194.4472.2@smtp.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-tr-genel

Uygar,
RETURNING anahtar kelimesinin kullanımını gösterdiğin için
teşekkürler ama benim sorum id değerini almakla alakalı değildi,
sanırım tam açıklayamadım.

Can,
SERIAL tipi hakkındaki bilgilendirme için teşekkürler. Hata
hakkındaki düşüncelerine katılmam mümkün değil, biliyorum ironi
yapıyorsun ama yinede hata = sorun demek ve bence sorun kötü bir
şey :)

Konuya dönersek sanırım ben tam anlatamadım. Karşılaştırma
yapmayı çok sevmem çünkü her yiğidin bir yoğurt yiyişi vardır
ama meramımı anlatmanın daha kolay bir yolu oluduğu için
yapıyorum. Örneğin MSSQL de otomatik artan alanlara ön tanımlı
olarak değer girişi yapamazsınız. Böyle bir işlem yapmaya
çalıştığınızda sistem size bunun yapılamayacağını ve bu
alanın otomatik alan olarak tanımlandığını bildirir.

PostgreSQL tarafında ise hiç bir uyarı gelmeden insert kabul
ediliyor. Bana göre işin daha vahim kısmı aynı numarayı sayaçta
aynı tabloya ekleyebiliyor. Benim sorum bu alanı tıpkı MSSQL'de
olduğu gibi dışarından her türlü müdaheleye kapatıp sadece
PostgreSQL tarafından arttırılmasını sağlayabilir miyim?

Sizce PostgreSQL neden böyle bir yaklaşım seçti, ben MSSQL'in
yaklaşımı daha tutarlı görüyorum. Ancak PostgreSQL'in
yaklaşımınıda anlamak istiyorum. Belki farklı durumlar için daha
güzel avantajları vardır.

Zafer.

On Mon, Feb 1, 2016 at 1:52 PM, N. Can KIRIK <can(at)epati(dot)com(dot)tr> wrote:
> 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 KIRIK
> ePati Bilişim Teknolojileri
> 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.
>

In response to

Responses

Browse pgsql-tr-genel by date

  From Date Subject
Next Message Sinan Duman 2016-02-01 14:13:12 Re: [pgsql-tr-genel] Otomatik artan alan tanımı
Previous Message N. Can KIRIK 2016-02-01 11:52:51 Re: [pgsql-tr-genel] Otomatik artan alan tanımı