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 14:30:40 |
Message-ID: | CAJ1wP5mLf8wT0akZ1rWgA=ikWYj+osbdoQA98505XYjJHUu6Dg@mail.gmail.com |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-tr-genel |
dba.stackexchange'de bu konuyla ilgili güzel bir öneri var;
http://dba.stackexchange.com/questions/116054/prevent-explicit-insert-into-serial-columns
*N. Can KIRIKePati Bilişim Teknolojilerihttp://www.epati.com.tr/
<http://www.epati.com.tr/>*
2016-02-01 15:43 GMT+02:00 Zafer Çelenk <zafercelenk(at)gmail(dot)com>:
> 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.
>>
>
>
From | Date | Subject | |
---|---|---|---|
Next Message | Devrim GÜNDÜZ | 2016-02-01 19:44:24 | Re: Otomatik artan alan tanımı |
Previous Message | Sinan Duman | 2016-02-01 14:13:12 | Re: [pgsql-tr-genel] Otomatik artan alan tanımı |