Re: [pgsql-tr-genel] Otomatik artan alan tanımı

From: Sinan Duman <sinanduman(at)gmail(dot)com>
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 14:13:12
Message-ID: CAMZ1Ymsn4dS+btg_yPFV8wuob7QuFd-qVQQKzcPsqBc-Ejeoqg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-tr-genel

Merhaba Zafer Bey ,

Sorun olarak algılanan şey sizin, "id" olarak tanımladığınız alanın pk
olmamasından kaynaklı. "id serial primary key" olarak tanım yapmış
olsaydınız, id alanı aynı değere ulaştığında hata verirdi, çünkü pk'ler
duplike olmaz.
Neden elle verilen değerlerde "id" alanı, serial regclass, değeri artmaz?
Burası tamamen sizin özgürlüğünüzdür. İster elle verirsiniz, ister yeni
kayıt oluştuğunda regclass'dan bir arttırılmış değeri alırsınız. mssql sizi
kısıtlıyor.
id alanını boş geçtiğinizde, regclass "internel trigger" ile size, son
değerinden bir fazlasını değer olarak verir. elle verdiğinizde size yeni
değer vermez. yani regclass'dan bir değer üretilmeyeceği için, id sayacı
artmaz.
alter table <table_name> disable trigger all; deyip, internal
trigger'ların, pk,fk, constraint'lerin disable durumunda davranışlarını da
izleyip çeşitli sonuçlar çıkartabilirsiniz.

İyi çalışmalar.

1 Şubat 2016 15:43 tarihinde Zafer Çelenk <zafercelenk(at)gmail(dot)com> yazdı:

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

In response to

Browse pgsql-tr-genel by date

  From Date Subject
Next Message N. Can KIRIK 2016-02-01 14:30:40 Re: [pgsql-tr-genel] Otomatik artan alan tanımı
Previous Message Zafer Çelenk 2016-02-01 13:43:14 Re: Otomatik artan alan tanımı