12C New Feature : Identity Columns

Tabloda unique bir alana ihtiyaç duyduğumuz da 12c öncesinde bu sorunu sequence kullanarak çözüyorduk. 12c ile birlikte identity olarak tanımlayabileceğimiz ve otomatik olarak bu unique değeri oracle’ ın kendisinin vermesini sağlayabileceğimiz bir kolon tipi getirildi.

Öncelikle 12c öncesindeki durumu simüle edelim, sonrasında 12c versiyonunda bu işi nasıl yapabiliyoruz ona bakalım.

Öncelikle testimiz de kullanacağımız numaratörümüzü create edelim.

Test tablomuzu create edelim;

Oluşturduğumuz sequence’ i kullanarak tablomuzu kayıt atalım;

Kayıtları select edelim;

Tablomuzdaki id alanını dışardan bir sequence’ den ürettiğimiz sayı ile doldurduğumuz dan dolayı kolon üzerinde unique liğide sağlamış oluyoruz. Bu örnek en yalın haliyle bir tablodaki bir kolunu unique bir sıra ile otomatik olarak nasıl doldurabileceğimizi anlatıyor.

12c ile ne değişti peki ona bakalım, öncelikle bu işlem için artık bir sequence oluşturmamıza gerek yok. Identity kolon içeren tablo create ederken kullanabileceğimiz 3 farklı yöntem bulunmaktadır;

GENERATED BY DEFAULT AS IDENTITY
GENERATED BY DEFAULT ON NULL AS IDENTITY
GENERATED ALWAYS AS IDENTITY

Şimdi sıra ile bu syntax lar arasındaki farklara bakalım;

• Generated by default as identity

Default olarak kullanılan şeklidir. Set edildiği kolona sıradan değer atayarak doldurur. Bunu kullanırken identity olarak create etmiş olduğunuz kolona sizde dışardan spesifik olarak değer atayabilirsiniz. Insert ederken bu kolona bir değer gödermezseniz, bu alanın değeri oracle tarafından tablo create edilirken internal olarak oluşturmuş olduğu sequence tarafından doldurulur. Test için bir tablo create edelim ;

Öncelikle id kolonunu belirtmeden data insert edelim ve id alanının otomatik olarak dolduğunu görelim;

Tablomuzu kontrol edelim ;

Tabloya bakalım tekrar;

“generated by default as identity” ile tabloyu oluşturduğumuz da ilgili kolona biz değer atamak istiyorsak veya sistem tarafından otomatik olarak değer atanmasını istiyorsak kullanabiliriz.

Ancak generated by default as identity olarak oluşturulmuş olan kolona “NULL” olarak data insert edemezsiniz. Etmeye çalıştığımız da aşağıdaki hatayı alırız ;

===> insert into kamil.identity1 values (NULL,’test2′)
insert into kamil.identity1 values (NULL,’test2′)
Error at line 1
ORA-01400: cannot insert null into(“KAMIL”.”IDENTITY1″.”ID”)
Script Terminated on line 21.

Identity olan kolondaki değerleri sonradan da update edebilirsiniz.

• Generated by default on null as identity

Tabloya, identity kolonu üzerinde NULL değer assign etmemiz gerektiğinde ON NULL clause ile birlikte identity kolon create edebiliriz. Insert scripti içeriside NULL göndermeniz demek ID alanının da NULL olacağı anlamına gelmez, bu durumda da oracle ID alanına kaldığı yerden değer atamaya devam edecektir. Burdaki temel fark syntax olarak bu kullanıma da izin veriyor olmasıdır. Kolonun type’ ı zaten identity olduğundan dolayı zaten NULL olması beklenmemelidir.

Tabloya hem identity alanı boş olarak hemde null olarak data insert etmeyi deneyelim. (aşağıda her 3 durum içinde örnek insert scriptini görebilirsiniz) ;

Identity olan kolondaki değerleri sonradan da update edebilirsiniz.

• Generated always as identity

Son olarak “generated always as identity” opsiyonu ile identity kolon oluşturduğumuz da, ilgili kolon user tarafından update edilemez hiçbir şekilde değiştirilemez durumda olacaktır. (adından da anlaşılacağı üzere) always as identity ile ilgili kolonun yönetimi tamamiyle oracle’ a bırakılmış demektir. Identity olarak create edilmiş olan kolonu dışardan insert veya update etmeye kalktığımızda hata alırız.

Yukarıdaki testin bir benzerini burada da yapalım ;

Id kolonuna müdahale etmeden diğer kolonlara data insert edebilirsiniz.

Id kolonuna da dışardan değer girmek istediğiniz de ;

Veya, identity kolonuna NULL olarak insert etmek istediğiniz de ;

Hatasını alırsınız. Tabloda 1 tane başarılı insert yapabildik. Bakalım ;

Şimdi id kolonunu update etmeye çalışırsak ;

Yine hata aldığımızı göreceksiniz.

Bir ufak bilgi ,identity kolon tanımlarken sıra değerlerinin kaçtan başlayacağını ve bir sonraki değerin ne şekilde artmasını istiyorsanz tarifleyebilirsiniz. Örneğin ;

İdentity’ yi sağlayan yapı daha önceki versiyonlarda olduğu gibi burda da sequence, sadece burdaki sequence create etme ve yönetme işini oracle sizin yerinize yapıyor ve yönetiyor. Biraz daha detaylandıralım ;

Yukarıda kullandığımız insertlerden bir tanesinin execution planına bakalım ;

insert into kamil.identity3 (name) values (‘test1’);

seq

Execution planında ISEQ$$_93163 adında bir squence görüyoruz. Kontrol edelim ;

Sequenceler arasında da bunu görebiliyoruz. Sistem tarafından oluşturulmuş olan bu sequenceleri user sequence’ leri ile karıştırmamak lazım zira bunu diğerlerindeki alter edemezsiniz.

Yine aynı şekilde sistem tarafından oluşturulmuş olan sequence’ i drop edemezsiniz ;

Identity alanında bir değişiklik yapmak isterseniz bu değişikliği sequence’ i alter ederek değil tabloyu alter ederek yapabilirsiniz ;

Bir diğer bilgi ;

Database ‘ de kullanmış olduğunuz identity kolonları select etmek içinse aşağıdaki view’ i kullanabilirsiniz ;

Tabloda aynı zamanda IDENTITY_OPTIONS kolonuda varki oda sequence’ in sistem tarafından nasıl oluşturulduğunu göstermektedir.

CDB_TAB_IDENTITY_COLS view’ i yukarıdakine ek olarak CON_ID kolonunu içerirki oda container bazında select ettiğiniz de ilgili tablonun hangi container’ da olduğunu adreslemektedir.

Yukarıda identity özelliğini kullanarak tablo create ettiğiniz de, bu tablo için oluşturulmuş olan sequence’ i drop edemeyeceğinizi belirtmiştik. Burada tabloyu drop ettiğiniz de sequence’ de otomaitk olarak drop olacaktır.

Sequence’ i tekrar kontrol ettiğimiz de ;

Artık olmadığını göreceksiniz.

Identity kullanımını ile ilgili detayları böylelikle özetlemiş olduk.

Reference;
12C New Feature : Identity Columns (Doc ID 1618440.1)

Be Sociable, Share!

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


2 + dört =