Oracle veritabanı platformunda diğer bazı platformlarda bulunan autonumber gibi otomatik veri tipleri bulunmamaktadır. (En azından ben şu ana kadar böyle bişi görmedim 🙂 ) Dolayısı ile tablolarda satırlara benzersiz (unique) bir tanımlayıcı eklemek için başka yöntemler kullanılır. Bunlardan en çok kullanılanı bir adet sequence oluşturup insert olayına atanan bir trigger ile gerekli alana istenen benzersiz değerin sequence’tan okunarak atanmasıdır.
Şimdi anlatacağım yöntemin ne avantajı olur açıkçası bilmemekteyim, fakat şöyle bir fikrim var veritabanı nesne sayısını azaltabilir. Bu yöntem de işleyiş açısından yukardaki (herkesin kullandığı) yönteme benzemekte. Tek farkı sequence kullanılmaması. Sequence kullanmak yerine tablonun rownum pseudo-column (yalancı alan) değerini sorgulamak ve değeri almaktır. Bu işlemde belirli bir satıra veya değere göre sorgulama yapmadığımız için mantık doğru çalışacaktır. Ancak şöyle bir dezavantajı var ki (prroze ‘ye teşekkür ederim) eğer tablodan kayıt çıkarırsanız bu işlem sonucunda benzersiz bir anahtar elde edemezsiniz. Dolayısı ile kullanım alanı olarak log tablosu gibi sadece artan yapılarda doğru sonuç verecektir.İşleme bir tablo oluşturmakla başlayalım:CREATE TABLE t_deneme( IDD NUMBER(3) DEFAULT 0,DEGER NVARCHAR2(15));
PK alanını belirliyoruz:CREATE UNIQUE INDEX t_deneme_pk ON t_deneme (IDD);ALTER TABLE t_denemeADD (CONSTRAINT t_deneme_pk PRIMARY KEY (IDD) USING INDEX);
Şimdi tablomuz oluştu ve boş. İşlemi yapacak olan trigger’ı oluşturuyoruz:CREATE OR REPLACE TRIGGER trg_deneme_iddBEFORE INSERT ON t_denemeREFERENCING NEW AS yeni OLD AS eskiFOR EACH ROWDECLAREuid NUMBER;BEGINuid := 0;SELECT NVL(MAX(ROWNUM),0)+1 INTO uid FROM t_deneme;:yeni.idd := uid;END;
İşte bu kadar. NVL fonksiyonu eğer sorguladığınız değer NULL olarak geri dönüyorsa size NULL değerini değil de 2. parametresini gönderir. Bizim komutumuzda bu değer 0’dır. MAX(ROWNUM) sorgusu bize tablodaki satır (kayıt) sayısını getirir. Eğer tablo boşsa geriye NULL değer döner.
Trigger INSERT olayı gerçekleşmeden çalışır. Yani eklemek istediğimiz kayıt daha eklenmemiştir. kayıtın bulunduğu cursor (yeni) üzerinde satır sayısı +1 değerini düzenleriz ve trigger’ı bitiririz. Trigger sonlanınca cursor tabloya eklenir.Bu kadar. 🙂