Veritabanı Tasarımı Seriler ile Çalışma
Konular Bir serinin en az üç kullanışlı özelliğini listelemek Bir seri oluşturan SQL ifadesini yazmak ve çalıştırmak Veri sözlüğünü bir seri tanımını onaylamak için USER_SEQUENCES kullanarak sorgulamak NEXTVAL kullanarak tabloda seri benzersiz numaralar oluşturmak için kuralları uygulamak Seri değerlerini önbelleğe almanın avantaj ve dezavantajlarını listelemek Bir seride boşlukların neden oluştuğuna üç neden vermek 2
Amaç Londra maratonuna katılan 30000 kişinin isimlerini, herhangi bir kişiye aynı kimlik numarası vermeden veritabanına girmek ne kadar can sıkıcı olur tahmin edebilir misiniz? Eğer öğle yemeği için gidip döndüğünüzde başkası koşucuların uygulamalarına girmişse ne olur? Tekrar nereden başlayacağınızı nasıl bilebilirsiniz? Neyse ki, SQL otomatik olarak benzersiz sayılar oluşturmada yinelenen sayıların detayları hakkında endişeyi ortadan kaldıran bir işleme sahiptir. Numaralandırma işlemi SEQUENCE olarak adlandırılan bir veritabanı nesnesi tarafından gerçekleştirilir. 3
Seri Nesnesi Tablo ve görünüm veritabanı nesnelerini nasıl oluşturacağınızı biliyorsunuz. Üçüncü veritabanı nesnesi seridir. Bir seri benzersiz numaraları otomatik olarak oluşturmak için kullanılan paylaşımlı bir nesnedir. Paylaşılabilir bir nesne olduğundan çoklu kullanıcı ona erişim sağlayabilir. Tipik olarak, seriler, birincil anahtar değeri oluşturmak için kullanılır. 4
Seri Nesnesi Birincil anahtarlar her bir satır için benzersiz olmalıdır. Seri bir Oracle iç rutini tarafından oluşturulur ve arttırılır (azaltılır). Bu nesne yazmanız gereken kodlama miktarını azalttığı için zaman tasarrufu sağlar. 5
Seri Nesnesi Seri numaraları tablolardan bağımsız olarak oluşturulup saklanır. Bu nedenle aynı seri çoklu tablolar için kullanılabilir. Seri oluşturmak için: 6
Seri Nesnesi sequence INCREMENT BY n START WITH n Seri oluşturucunun adıdır. Seri numaraları arasındaki tamsayın aralığını belirler (varsayılan değer 1). Oluşturulacak ilk seri numarasını belirler (varsayılan başlangıç değeri 1). 7
Seri Nesnesi MAXVALUE n NOMAXVALUE MINVALUE n Serinin oluşturulabileceği maksimum değeri belirler. Artan bir seri için 10^27 ve azalan seri için -1 maksimum değerini belirler (varsayılan). Serinin minimum değerini belirler. 8
Seri Nesnesi NOMINVALUE CYCLE NOCYCLE 9 Artan bir seri için 1 ve azalan seri için (10^26)minimum değerini belirler (varsayılan). Seri maksimum değerine ulaştıktan sonra değer üretmeye devam edip etmeyeceğini belirler (varsayılan değer NOCYCLE) CAHCE n NOCACHE Oraclesunucu ön yer tutma ve bellek için ne kadardeğer belirler (varsayılan ön bellek 20). Sistem çökerse, değerler kaybolur.
Seri Oluşturma Londra maratonu koşucuları için oluşturulan seride numaralar 1 artar ve 1 den başlar. Bu durumda seriyi 1 den başlatmak en iyi başlangıç noktasıdır. 10
Seri Oluşturma Elit gruptaki en iyi koşucunun 1 numara giymesi bir gelenektir. Bölüm numarası ve çalışan numarası gibi diğer durumlar için başlangıç sayısı farklı atanabilir. En az 30.000 koşucu olacağı için, serinin maksimum değeri beklenen koşucu sayısının üstünde belirlenir. 11
Seri Oluşturma NOCACHE seçeneği serideki değerlerin sistem hatası durumunda kayıpları önlemek için ön bellekte tutulmasını önler. 12
Seri Oluşturma NOCYCLE seçeneği numaralandırmayı 1 den başlatır ve 50000 aşımından korur. CYCLE seçeneğini eğer seri birincil anahtar değerleri oluşturmak için kullanılıyorsa eski satırları yenileri ekleme süresinden daha hızlı çalıştıran güvenilir bir mekanizma olmadığı sürece kullanmayın. 13
Serileri Onaylama Oluşturulmuş bir seriyi onaylamak için USER_OBJECTS veri sözlüğü sorgulanır. Serinin tüm özelliklerini görmek için USER_SEQUENCES veri sözlüğü sorgulanır. Aşağıdaki SELECT komutunda değer isimlerini listeleyin. NOCACHE belirtilmişse yukarıdaki sorgudaki last_number sütunu bir sonraki uygun seri numarasını gösterecektir. CACHE belirtilmişse sorgudaki last_number sütunu ön bellekte tutulmayan bir sonraki uygun seri numarasını gösterecektir. 14
NEXTVAL ve CURRVAL Sözde Sütunları NEXTVAL sözde sütunu belirlenen seriden başarılı seri numaralarını çıkarmak için kullanılır. NEXTVAL ifadesini seri adı ile nitelendirmelisiniz. Eğer sequence.nextval ifadesini belirtirseniz, yeni bir seri numarası oluşturulur ve mevcut seri numarası CURRVAL içine yerleştirilir. 15
NEXTVAL ve CURRVAL Sözde Sütunları Aşağıdaki örnekte DEPARTMENTS tablosuna yeni bir bölüm eklenmektedir. Yeni bir bölüm numarası oluşturmak için DEPARTMENTS_SEQ serisi şu şekilde kullanılır: 16
NEXTVAL ve CURRVAL Sözde Sütunları Yeni bölüme çalışanlar almak istediğinizi düşünün. Tüm yeni çalışanlar için çalıştırılacak INSERT komutu şu kodu içermelidir: Not: Önceki örnekte EMPLOYEE_SEQ isimli serinin yeni çalışan numarası oluşturmak için daha önceden oluşturulmuş olduğu varsayılmaktadır. 17
NEXTVAL ve CURRVAL Sözde Sütunları Aşağıdaki örnekteki CURRVAL sözde sütunu varsayılan kullanıcı için oluşturulan yeni seri numarasını belirtir. NEXTVAL varsayılan kullanıcı oturumunda seri numarası oluşturmak için CURRVAL belirtilmeden kullanılmalıdır. CURRVAL seri adı ile nitelendirilir. sequence.currval belirtilirse bu kullanıcı işlemi tarafından üretilen son değer geri döndürülür. 18
Seri Kullanma Bir seri oluşturduktan sonra tablonuzda kullanmak üzere seri numaralar oluşturur. Seri değerlerini NEXTVAL ve CURRVAL sözde sütunlarını kullanarak belirtin. NEXTVAL ve CURRVAL ifadelerini şu içeriklerde kullanırsınız: Alt sorgunun bir parçası olmayan bir SELECT komutunun SELECT listesi INSERT komutundaki alt sorgunun SELECT listesi INSERT komutunun VALUES deyimi UPDATE komutunun SET deyimi 19
Seri Kullanma NEXTVAL ve CURRVAL ifadelerini şu içeriklerde kullanamazsınız: Bir görünümün SELECT listesinde SELECT ifadesinde DISTINCT anahtar kelimesi ile SELECT ifadesinde GROUP BY, HAVING ya da ORDER BY deyimleri ile SELECT, DELETE ya DA UPDATE ifadelerindeki bir alt sorguda CREATE TABLE ya da ALTER TABLE ifadesindeki DEFAULT deyiminde 20
Seri Kullanma Londra maratonu örneğine devam edersek, aşağıdaki sözdizimi koşucular tablosuna yeni bir katılımcı bilgisi eklemek için kullanılır. Koşucuların kimlik numarası serideki NEXTVAL tarafından alınarak oluşturulur. 21
Seri Kullanma runners_id_seq için şimdiki değerine bakmak için CURRVAL kullanılır. DUAL tablosunun kullanımına bu örnekte bakın. Oracle Uygulama Geliştirici bu sorguyu çalıştıramaz fakat bunun nasıl çalışacağını anlayabilirsiniz. 22
Seri Kullanma Serilerdeki önbellekte tutma seri değerlerine daha hızlı erişimi sağlar. Önbellek seriye ilk defa erişildiğinde doldurulur. Sonraki seri değeri için her istek önbellek serisinden alınır. Son seri değeri kullanıldıktan sonra, seri için bir sonraki istek belleğe serilerin başka önbelleğini çeker. Önbellekte tutulan seri sayısını varsayılan değeri 20 dir. 23
Seri Olmayan Numaralar Seri üretici boşluk olmadan seri numaraları oluşturmasına rağmen, bu işlem veritabanı commit ya da rollback işleminden bağımsız olarak oluşur. Boşluklar (seri olmayan numaralar) şu şekilde oluşturulabilir: Bir seri içeren ifadeyi rollback yaparak, numara kaybolur Bir sistem hatası ile. Eğer seri değerleri ön belleğe alır ve sistemde hata oluşursa bu değerler kaybedilir. Aynı seri birden çok tablo için kullanılarak. Bunu yaparsanız her tablo seri numaralarda boşluklar içerecektir. 24
Sonraki Değere Bakma Eğer seri NOCACHE ile oluşturulmuş ise bir sonraki uygun seri değeri artım yapılmadan USER_SEQUENCES tablosu sorgulanarak arttırılabilir. 25
Seriyi Düzenleme Diğer veritabanı nesnelerinde olduğu gibi bir seri ALTER SEQUENCE ifadesi kullanılarak değiştirilebilir. Şayet Londra maratonu 50000 koşucu kaydını aşsaydı ve yeni numaralara ihtiyaç duysaydınız ne olurdu? Seri MAXVALUE değerini var olan sayı sırası değiştirilmeden arttırmak için değiştirilmelidir. 26
Seriyi Düzenleme Bir seri değiştirilirken bazı doğrulamalar yapılır. Örneğin, o anki sıra sayısından daha az olan yeni bir MAXVALUE değeri çalıştırılamaz. 27
Seriyi Güncelleme Kuralları ALTER SEQUENCE deyimi çalıştırılırken birkaç kural geçerlidir. Bunlar: Değiştirmek için serinin sahibi olmanız ya da ALTER yetkisine sahip olmanız gerekir ALTER SEQUENCE deyiminden sadece gelecek sıra numaraları etkilenir. START WITH seçeneği ALTER SEQUENCE kullanılarak değiştirilemez. Seri kaldırılmalı ve farklı bir seri numarası ile tekrar başlaması için tekrar oluşturulmalı. 28
Seriyi Kaldırma Bir seriyi veri sözlüğünden kaldırmak için DROP SEQUENCE deyimi kullanılır. Kaldırmak için serinin sahibi ya da DROP ANY SEQUENCE yetkisine sahip olmanız gerekir. Bir kez kaldırıldığında seri artık belirtilemez. 29