Re: Otomatik artan alan tanımı

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

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: Uygar UZUNHASAN <uuzunhasan(at)nobelyazilim(dot)com>
To: pgsql-tr-genel(at)postgresql(dot)org
Subject: Re: Otomatik artan alan tanımı
Date: 2016-02-01 09:08:10
Message-ID: 56AF207A.1060209@nobelyazilim.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-tr-genel

1.2.2016 09:50 tarihinde Zafer Çelenk yazdı:
> 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.
INSERT INTO tablo_adi(column1)VALUES ('DENEME') RETURNING id;

>
> 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.
>
select * from nextval('test_id_seq'::regclass);
> Zafer.

Attachment Content-Type Size
uuzunhasan.vcf text/x-vcard 260 bytes
unknown_filename text/plain 112 bytes

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: Raw Message | Whole Thread | Download mbox | Resend email
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: 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
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.
>


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


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: Raw Message | Whole Thread | Download mbox | Resend email
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: Devrim GÜNDÜZ <devrim(at)gunduz(dot)org>
To: Zafer Çelenk <zafercelenk(at)gmail(dot)com>, "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 19:44:24
Message-ID: 1454355864.4549.50.camel@gunduz.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-tr-genel


Merhabalar,

On Mon, 2016-02-01 at 15:43 +0200, Zafer Çelenk wrote:
> 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?

Hayır.

Saygılar,

--
Devrim GÜNDÜZ
Principal Systems Engineer @ EnterpriseDB: http://www.enterprisedb.com
PostgreSQL Danışmanı/Consultant, Red Hat Certified Engineer
Twitter: @DevrimGunduz , @DevrimGunduzTR


From: Devrim GÜNDÜZ <devrim(at)gunduz(dot)org>
To: Zafer Çelenk <zafercelenk(at)gmail(dot)com>, "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 19:51:41
Message-ID: 1454356301.4549.57.camel@gunduz.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-tr-genel


Merhabalar,

On Mon, 2016-02-01 at 15:43 +0200, Zafer Çelenk wrote:
> 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.

Önceki iletileri okuyamadım tam, ama bu kısma kısa bir yanıt yazayım:
Bazı durumlarda veritabanlarının huyuna suyuna gitmekte yarar var ;) .
Eğer serial bir alan kullanıyorsanız PostgreSQL'de (-ki öyle bir veri
tipi yok aslında, bu bir makrodur), buraya veri girerken

INSERT INTO hede VALUES (DEFAULT,'a',1');

gibi bir sözdizimi kullanmalısınız. Bu şekilde kullanırsanız, zaten
elle veri girme diye birşey olmayacak. Hatadan da kaçacaksınız. Bu
PostgreSQL yolu. SQL Server'in yolu farklı olabilir. Burada açıkcası
bir sürü teknik neden var (ben PG'ninkini tercih ediyorum concurrency
için, ama herkesin yoğurt tadımı farklı).

Buna ve benzeri şeylere şimdiden alışmak iyi olabilir; zira 1 sene
sonra PostgreSQL'de yazılacak kodlarda da değişiklikler olmaya
başlayacak parallel sort özelliğinden başlayarak...

Saygılar,
--
Devrim GÜNDÜZ
Principal Systems Engineer @ EnterpriseDB: http://www.enterprisedb.com
PostgreSQL Danışmanı/Consultant, Red Hat Certified Engineer
Twitter: @DevrimGunduz , @DevrimGunduzTR


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-02 06:52:31
Message-ID: 1454395951.4472.3@smtp.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-tr-genel


> Önceki iletileri okuyamadım tam, ama bu kısma kısa bir yanıt
> yazayım:
> Bazı durumlarda veritabanlarının huyuna suyuna gitmekte yarar var
> ;) .
> Eğer serial bir alan kullanıyorsanız PostgreSQL'de (-ki öyle bir
> veri
> tipi yok aslında, bu bir makrodur), buraya veri girerken

Merhaba,

Sorularıma verdiğiniz cevaplar için teşekkürler Devrim.

Serial tanımının bir veri tipi değil makro olduğu konusundaki
bilgilendirme için teşekkürler ancak bu konuyu pgAdmin ekibinede
iletirseniz daha faydalı olur. Benim gibi PostgreSQL'e yabancı biri
pgAdmin üzerindeki data type bölümünde serial tanımını görünce
haliyle bunun bir veri tipi olduğunu düşünüyor.

> INSERT INTO hede VALUES (DEFAULT,'a',1');
>
> gibi bir sözdizimi kullanmalısınız. Bu şekilde kullanırsanız,
> zaten
> elle veri girme diye birşey olmayacak. Hatadan da kaçacaksınız. Bu
> PostgreSQL yolu. SQL Server'in yolu farklı olabilir. Burada
> açıkcası
> bir sürü teknik neden var (ben PG'ninkini tercih ediyorum
> concurrency
> için, ama herkesin yoğurt tadımı farklı).

Yanlış anlaşılmasın her şeye karşı değilim :) ama doğru
bildiğimi söylemektende çekinmem. Bence bu insert yazımıda çok
doğru değil, bana göre kod kendini basit anlamda açıklamalı.
Burda 1 değerinin neyi temsil ettiğini kimse tahmin edemez, oysa
şöyle bir yazım bence çok daha mantıklı.

INSERT INTO hede(id, isim, yonetici_mi) VALUES (DEFAULT,'a',1');

Bu yazımda 1 değerinin en azından neyi temsil edebileceğini tahmin
etmek daha kolay ve ilk bakışta veriyi anlamlandırmak daha basit,
benim tercihim bu yönde olur ancak diğeride alternatif olarak
sunulabilir. Ayrıca çok alan içeren tablolar için kullanışlıda
olabilir.

Otomatik artan alan için eşzamanlılık konusunda PostgreSQL'in
sunduğu teknik gerçekten daha esnek görünüyor. Peşin fikirli
değilim deneyip görmek gerek, insan farklı yapılarla
karşılaşınca ister istemez bir karşılaştırma sürecine giriyor.

Zafer.

>
> Buna ve benzeri şeylere şimdiden alışmak iyi olabilir; zira 1 sene
> sonra PostgreSQL'de yazılacak kodlarda da değişiklikler olmaya
> başlayacak parallel sort özelliğinden başlayarak...
>
> Saygılar,
> --
> Devrim GÜNDÜZ
> Principal Systems Engineer @ EnterpriseDB: http://www.enterprisedb.com
> PostgreSQL Danışmanı/Consultant, Red Hat Certified Engineer
> Twitter: @DevrimGunduz , @DevrimGunduzTR
>
>