Bu sayfa makine çevirisidir. İngilizce orijinalini okuyun. English

IBSurgeon kütüphanesi

Таблицы. Первичные ключи и генераторы

NOTICE: Bu belge, Alexey Kovyazin ve Serg Vostrikov tarafından yazılan “The InterBase World” kitabından alınan bölümdür.

InterBase ilişkisel bir DBMS’dir. Ayrıca, bu, InterBase’deki tüm verilerin tablolar olarak saklandığı anlamına gelir. SQL açısından gerçekleştirilen tablo, bir kağıda elle çizilebilen veya Microsoft Excel gibi bir programda oluşturulabilen sıradan tabloya çok benzer. InterBase’deki tablolar, verilerin yerleştirildiği sütunlara ve satırlara sahiptir. Tablonun mutlaka bir adı olmalıdır ve bu ad bir veritabanı içinde benzersizdir. Tablolar, bir veritabanındaki bilgilerin ana deposudur ve bu nedenle tabloları oluştururken çok dikkatli olmalısınız.

İlişkisel veritabanında tabloların nasıl oluşturulacağını, gerçek dünyanın verilerini yansıtan ve aynı zamanda bir veritabanında bilgilerin etkili bir şekilde saklanmasını organize etmeye izin veren kurallar vardır. Bu kuralların “doğru” bir veritabanı tasarlamak için uygulanması sürecine normalizasyon denir. “Doğru” kelimesini bilerek tırnak içine aldık, çünkü “normalize edilmiş veritabanı” ve “optimize edilmiş veritabanı” eşanlamlı değildir. Normalizasyon kurallarına kesin olarak uymak zorunda değilsiniz - her zaman belirli bir problemin özelliklerine göre düzeltme uygulayın.

Veritabanındaki tabloların normalizasyonu [14. kitabında ayrıntılı olarak ele alınmıştır ve bu nedenle kucaklanamaz olanı kucaklamaya çalışmayacağız ve tartışma konumuza - InterBase tablolarına geri döneceğiz. Tablo oluşturmayı sağlayan DDL (DDL - Data Definition Language, daha fazla ayrıntı için sözlüğe bakın) cümlesinin sözdizimini ele alalım:

CREATE TABLE table [EXTERNAL [FILE] “”] ( [, | …]);

Burada table, oluşturulan tablonun adıdır, - oluşturulan tablonun sütunlarının (bazen alanlar diyeceğiz) açıklamasıdır. table [EXTERNAL [FILE] “”] seçeneği, paylaşılan bir veritabanı dosyasında değil, adlı ayrı bir dosyada saklanan sözde harici tablonun oluşturulacağı anlamına gelir. Gördüğünüz gibi, her şey basit - bir tablo adı ve içerdiği sütunları tanımlarız. Şimdi sütunların nasıl tanımlanacağını ayrıntılı olarak ele alacağız. Bir sütun oluşturmanın sözdizimi aşağıdaki DDL cümlesiyle açıklanır:

= col { datatype | COMPUTED [BY] (< expr>) | domain}

[DEFAULT { literal | NULL | USER}]

[NOT NULL] [ ]

[COLLATE collation]

Bu oldukça büyük bir tanımdır, ancak bir sütunun tanımında verilen cümlelerin yalnızca küçük bir kısmı zorunludur. Tablodaki her sütunun, tablo içinde benzersiz bir adı ve ayrıca datatype cümlesiyle tanımlanan bir veri türü veya bir sütunun değerini hesaplamak için bir ifade (hesaplanan sütunlar için) veya tanımlanan domain (aşağıya bakın) olmalıdır. Veri türleri “Veri türleri” bölümünde ele alındı; bu nedenle, bir tablo oluşturmak için SQL ifadesinin nasıl oluşturulduğunu kolayca anlayabilirsiniz.

Daha önce “Veritabanı oluşturma” bölümünde oluşturulan FIRSTBASE.gdb veritabanımıza bağlanalım ve tablolarla pratikte çalışmayı deneyelim. Tabloların oluşturulması, silinmesi ve güncellenmesi söz konusu olduğunda, “InterBase yönetici ve geliştirici araçları” uygulamasında listelenenlerden herhangi bir InterBase yönetim aracı ve ayrıca herhangi bir InterBase klonunun tedarik setinden standart isql.exe yardımcı programı uygun olacaktır.

İşte TABLE_EXAMPLE adlı ve çeşitli türlerde 3 alan içeren basit bir tablo örneği:

CREATE TABLE Table_example ( ID INTEGER, NAME VARCHAR(80), PRICE_1 DOUBLE PRECISION);

Bu tablo, bir veritabanı geliştirme sürecinde en sık karşılaşılan durumu gösterir. Ancak, alanları tanımlamanın başka yöntemleri de vardır. Örneğin, alan türünü domainler kullanarak ayarlayabiliriz. Domain, belirli tür parametre kombinasyonlarını uygulama kolaylığı için kullanıcı tarafından tanımlanan bir türdür. Örneğin, tanımlayıcı alanlarını belirtmek için D_ID domainini tanımlayabiliriz. Domaini tanımladıktan sonra, bir alanın türünü ayarlamak için kullanabiliriz:

CREATE DOMAIN D_ID AS INTEGER; CREATE TABLE Тable_example ( ID D_ID, NAME VARCHAR(80), PRICE_1 DOUBLE PRECISION);

ID alanı, D_ID domaini tarafından tanımlanan türe sahip olacaktır. Böylece, alan türünü domainde tanımlayarak, gerekli kontrolleri ve kısıtlamaları yaparak, bu domaini aynı işleve sahip alanlar oluşturmak için birçok kez uygulayabiliriz. Örneğin, değişken türlerinin tanımlarını kopyalama zahmetinden ve hata yapma tehlikesinden kaçınarak parasal alanlar için. Bir sütunu tabloda ayarlamanın üçüncü yolu, onu hesaplanmış (COMPUTED BY) olarak tanımlamak ve değerinin hesaplanacağı bir koşul belirtmektir. Örneğin, tablomuzda PRICE_1 alanının değerinden %10 hesaplayan bir sütun olmasını isteyebiliriz. Bu durumda, aşağıdaki komut yazılmalıdır:

CREATE TABLE Тable_example ( ID INTEGER, NAME VARCHAR(80), PRICE_1 DOUBLE PRECISION, PRICE_10 COMPUTED BY (PRICE_1.0.1));

Ancak, PRICE_1 alanına veri eklediğimiz anda PRICE_10 alanında bu alanın değerinin onda biri olacağını düşünmeyin. Hayır, süreç burada daha karmaşıktır. Aslında, gerekli onda biri yalnızca PRICE_10 alanına başvurduğumuzda, örneğin bu tabloya SELECT sorgusu çalıştırdığımızda elde ederiz. Yani hesaplanan alanda hiçbir veri saklanmaz ve alanla bağlantılı ifadenin hesaplanması getirilir ve sonuç sorgu yanıtı olarak üretilir.

Böylece, tablodaki alanları belirtmenin 3 ana yolunu ele aldık. Şimdi bir sütun oluştururken ayarlanabilen seçenekleri ayrıntılı olarak ele alalım. [DEFAULT {literal | NULL | USER}] seçeneği - bir sütun değerini varsayılan olarak ayarlamaya izin verir. Otomatik veri doldurma için çok uygundur. Varsayılan ayarlamanın 3 yolu vardır. İlki literal olarak belirtilir ve metin sabitleri, sayılar veya tarihler olarak varsayılan değerler ayarlamaya izin verir. Örneğin, metin varsayılanları olan bir sütun oluşturmak için aşağıdaki ifadeleri oluşturabiliriz: NAME VARCHAR(80) DEFAULT ‘Василий Станиславович’

Böylece, tabloya eklenen tüm alanlar varsayılan değerleri alır, yani NAME alanı için başka bir değer tanımlanmamışsa, ‘Vasily Stanislavovich’ dizesi görünecektir. Varsayılan ayarlamanın ikinci yolu, bir sütunun tanımında DEFAULT NULL belirtmektir. Ve yeniden oluşturulan kayıtlarda bu sütunun değeri NULL olacaktır, eğer başka bir değer açıkça ayarlanmamışsa, elbette. Bir örnek:

PRICE_1 DOUBLE PRECISION DEFAULT NULL

Varsayılan ayarlamanın üçüncü yolu, bir sütunun tanımında DEFAULT USER belirtmektir. Böylece yeniden oluşturulan kayıtlarda bu alan, geçerli kullanıcının adını içerecektir, yani InterBase ile bağlantı kuran ve bu eklemeyi gerçekleştiren kullanıcı (kullanıcılar hakkında daha fazla ayrıntı için “InterBase’de Güvenlik: kullanıcılar, işlevleri ve hakları” (bölüm 4) bölümüne bakın). Bazı alanlar için alanın boş olmayan bir değere sahip olması önemlidir. Örneğin, problem tanımına göre boş olamayacak bir alan. Bir alanın tanımlı bir değere sahip olması gerektiğine dair veritabanı düzeyinde bir kısıtlama ayarlamak için, sütun açıklamasına aşağıdaki eklemeyi yapmak gerekir:

NAME VARCHAR(80) NOT NULL

Böylece, içinde NULL değerlerin saklanamayacağı bir alan olacaktır. Genellikle NOT NULL kısıtlaması, bu alana kesin olarak doğru bir değer atayan DEFAULT seçeneğiyle birleştirilir. Ancak çoğu zaman NOT NULL kısıtlaması yeterli değildir. Örneğin, bir veritabanında fiyatları saklama durumunda, negatif değerler alamayacakları oldukça açıktır (gerçi mal alırken bize ekstra ödeme yapılsaydı harika olurdu). Bir sunucunun veritabanına eklenen fiyatların değerlerini pozitiflik koşuluna göre kontrol etmesini sağlamak için, bir sütunu aşağıdaki şekilde tanımlamak gerekir:

PRICE_1 DOUBLE PRECISION CHECK (PRICE_1>0)

PRICE_1 sütununa eklenen değerler pozitiflik koşuluna göre kontrol edilecektir. Farklı tutarlı seçeneklerin birleştirilebileceği ve örneğin boş olmayan bir değer ve pozitiflik kontrolü ayarlayabileceğimiz belirtilmelidir:

PRICE_1 DOUBLE PRECISION NOT NULL CHECK (PRICE_1>0)

Sütunlar oluşturulurken bazı seçenekler birleştirilemez, örneğin varsayılan olarak NULL ayarlamak ve aynı anda boş olmayan değer kısıtlaması imkansızdır. Kontrollerin bir veritabanında veri yönetimi üzerinde bir dizi yararlı işlev gerçekleştirebileceği belirtilmelidir. Kullanımlarını “Veritabanı kısıtlamaları” bölümünde ayrıntılı olarak ele alacağız.

Böylece, tabloları ve alanları farklı seçeneklerle oluşturma yollarını ele aldık. Ancak, zaten var olan tabloyu değiştirmemiz gereken durumlar vardır. Elbette, tabloyu tamamen yeniden oluşturabiliriz. Önce tabloyu silme komutunu çalıştırmalı ve sonra yeniden oluşturmalıyız. Örneğin:

DROP TABLE Table_example; CREATE TABLE Table_example(ID NUMERIC(15,2);

Ancak tabloları değiştirmenin bu yolu önemli dezavantajlara sahiptir. DROP komutunu kullanarak bir tabloyu silerken, tablonun içerdiği tüm veriler silinir ve bunları kaybetmemek için geçici tablolara kopyalamak gerekir. Bu oldukça zahmetlidir. Bu nedenle, tabloların yapısını kolayca değiştirmek için ALTER TABLE komutu vardır; bu komut yeni alanlar eklemeye, mevcut olanları silmeye ve ayrıca referans bütünlüğü kısıtlamaları eklemeye / silmeye izin verir.

Örneğin, bir kişinin soyadı hakkında veri saklamak için tabloya bir sütun daha eklemek istiyoruz:

ALTER TABLE Table_example ADD Patronimic VARCHAR(80);

Bu komutun yürütülmesinden sonra Table_example tablomuz Patronimic adında ve VARCHAR (80) türünde yeni bir sütuna sahip olacaktır. Tablodan NAME adlı bir sütunu silmek istiyorsak, aşağıdakini çalıştırmalıyız:

ALTER TABLE Table_example DROP Name;

ALTER TABLE ifadesinin tam sözdizimini [1.. içinde görebilirsiniz. Bu çok kullanışlı bir komuttur ve onu sık sık kullanacağız.

Peki, bir sütunu değiştirmek gerekirse ne yapacağız, diye soracaksınız? Örneğin, adları saklamak için NAME yerine HUMAN_NAME alanını kullanmanın daha iyi olduğuna karar verdik. Bu durumda ALTER TABLE uygulayabiliriz:

ALTER TABLE Table_example ALTER COLUMN NAME TO HUMAN_NAME;

Bir alanın türünü değiştirmeye karar verdiysek, örneğin bir alanda saklanan karakter sayısını artırmak için, ALTER DOMAIN ifadesini kullanarak bu alanın domainini değiştirmemiz gerekecektir (yukarıdaki “Veri türleri” bölümüne bakın).

Böylece, InterBase’de tabloların oluşturulmasını ve değiştirilmesini ele aldık. Şimdi veritabanı teorisine biraz daha derinlemesine girmenin zamanı geldi. InterBase, daha önce söylendiği gibi ilişkisel bir veritabanıdır. Ayrıca, bu, tablodaki her kaydın, bir kaydın diğerinden ayırt edilebileceği bir karaktere sahip olması gerektiği anlamına gelir. Bu amaca benzersiz anahtarların özel mekanizması hizmet eder.

Tablolarda birincil anahtarlar

Elbette, hiçbir anahtar içermeyen bir tablo oluşturabiliriz. Bunu yapmamız yasak değildir. Ancak, daha önce söylendiği gibi, normalizasyon kurallarına uymadan verimli bir veritabanı oluşturmak imkansızdır. Anahtarların varlığı normalizasyonun en önemli unsurudur. Bu nedenle, veritabanlarının teorisini ve normalizasyonunu ele almayı hedeflemesek de, anahtarların bir tanımını yapmalı ve InterBase’deki işlevlerini gözden geçirmeliyiz. Adım adım ilerleyeceğiz ve en yaygın anahtar türüyle başlayacağız - birincil anahtar.

Peki, birincil anahtar nedir? Tablodaki kayıtları bu tablo içinde benzersiz şekilde tanımlayan bir veya daha fazla alandır. Kulağa zor geliyor, ancak aslında her şey çok basit. Sıradan bir tablo hayal edin, örneğin muhasebe sayfası. İlk sütun nedir? Doğru, seri numarası - 1, 2, 3 … Bu numara tablo içinde benzersiz bir satırı belirtir ve bu numarayı bilmek tabloda bir dize bulmak için yeterlidir. Bu örnekte, bu birincil anahtar olacaktır. İlişkisel bir veritabanındaki tabloların ezici çoğunluğu mutlaka bir birincil anahtara (PK - Primary key kısaltması) sahiptir. Tabloları oluştururken yaygın kılavuz, bir birincil anahtar oluşturmaktır. Birincil anahtar, tablo oluşturulurken veya daha sonra oluşturulabilir. Tablo oluşturma anında ID alanının birincil anahtarımız olacağına karar verdiğimizi varsayalım. O zaman birincil anahtarı aşağıdaki şekilde ekleyebiliriz:

CREATE TABLE Table_example ( ID INTEGER NOT NULL, NAME VARCHAR(80), PRICE_1 DOUBLE PRECISION, CONSTRAINT pkTable PRIMARY KEY (ID));

Tablo table_example için birincil anahtar oluşturmak için ne yapılmalıdır? Tablonun tanımında neyin değiştiğine bakalım. İlk olarak, ID sütununa NOT NULL ek tanımı eklenmiştir. Bu önemlidir, çünkü birincil anahtar benzersiz olmalı ve tanımsız değerlerden arındırılmış olmalıdır. Bildiğiniz gibi NULL tanımsız bir değerdir. Bu nedenle, birincil anahtara dahil edilen tüm alanlar NOT NULL kısıtlamasına sahip olmalıdır. Birincil anahtarın oluşturulmasını tamamlamak için tablonun sonuna şu yazılmalıdır: CONSTRAINT ()

Kısıtlamaların tam sözdizimini “Veritabanı kısıtlamaları” bölümünde bulabilirsiniz þ. 1 ve birincil anahtar örneğimiz için şu şekilde görünecektir:

CONSTRAINT pkTable PRIMARY KEY (ID)

Burada pkTable birincil anahtarın adıdır ve ID içerdiği sütunlardır. Tablolar için birincil anahtarları bu şekilde tanımlamak, toplu tablo oluşturma sırasında (örneğin, farklı CASE kaynaklarından alınan betiklere dayalı bir veritabanı prototipi oluştururken) kullanışlıdır. Peki, tablo zaten mevcut ve verilerle doluysa birincil anahtar eklemek/silmek için ne yapmalıyız? Bu amaçla, komutun bir uzantısı olan ALTER TABLE uygulanmalıdır. Tablomuza birincil anahtar ekleme örneği:

ALTER TABLE TABLE_EXAMPLE ADD CONSTRAINT FF PRIMARY KEY (ID);

Böylece, Table_example tablosu, önceki örnekte tabloyla birlikte oluşturulduğundakiyle tamamen aynı birincil anahtara sahip olacaktır. Birincil anahtarı silmek için şu komut girilmelidir:

ALTER TABLE Table_example DROP CONSTRAINT pkTable;

Böylece, pkTable adlı anahtar veritabanından kaldırılacaktır.

Jeneratörler - birincil anahtarların en iyi dostları

Birincil anahtarın uygulanması hakkında birkaç söz söylemeliyiz. Benzersizliği desteklemek için tasarlandığından, bir tablodaki iki kayıt bu anahtarın aynı değerlerine sahip olamaz. Yani, bu koşulu sağlamak için, tabloya yeni bir kayıt eklerken InterBase tablodaki tüm kayıtları kontrol etmek ve tablonun bu değerleri içerip içermediğini bulmak zorundadır. Hızlı arama için InterBase, tablodaki bir kaydı çok hızlı bulmayı sağlayan özel InterBase nesneleri olan indeksler mekanizmasına sahiptir. Bu nedenle, birincil anahtar oluşturulurken ve silinirken, birincil anahtara dahil edilen alan (veya alanlar) için indeks oluşturulur veya silinir.

Daha önce belirtildiği gibi, birincil anahtar birkaç alan içerebilir. Böylece, bu alanların değerlerinin kombinasyonunun benzersizliğini fark edebiliriz. Örneğin, ID ve NAME alanları için bir anahtar tanımlarsak, sunucu tabloda bu alanların aynı kombinasyonlarının olmadığını kontrol eder. Yani, ID ve 1 ve “Ivanov”, 2 ve “Ivanov” alan kombinasyonları, ID alanının değerlerinde farklılık gösterdikleri için doğru olacaktır.

Böylece, birincil anahtar herhangi bir türden birkaç alan içerebilir. Ancak pratikte en yaygın anahtar türü sayaçtır - artan değerler içeren bir tamsayı alanı. Neden böyle? Bu, doğal ve ikame anahtarlar arasındaki eski tartışmanın bir yansımasıdır. Doğal anahtarlar kavramı, bir anahtar olarak veritabanının yansıttığı veri alanında gerçekten var olan değerleri kullanmamız gerektiğini söyler. Örneğin, bir pasaport dairesi için insan kayıt sistemi geliştiriyorsak, bu kavrama göre pasaport numarası ve serisinin bir kombinasyonu birincil anahtar olarak alınmalıdır. Gerçekten de, her kişinin benzersiz bir pasaport numarası ve serisi kombinasyonu olmalıdır. Ancak, bir kişinin hayatı boyunca pasaportunu değiştirebileceği gerçeğiyle ne yapmalıyız (belirli bir yaşa ulaşma, evlilik vb. nedeniyle)? Bu durumda, belirli bir kişiye karşılık gelen pasaport numarasını ve serisini değiştirmek zorunda kalacağız, yani aslında birincil anahtarımızı değiştirmek zorunda kalacağız. Bu, veritabanı uygulamalarının geliştirilmesi açısından istenmeyen bir durumdur: tablolar arasındaki dallanmış iletişim sistemini hesaba katarak (sonraki bölüm buna ayrılmıştır), geliştirici bu durumu kontrol etmek için büyük çaba sarf etmek zorunda kalacaktır.

Bu nedenle, çoğu durumda ikame anahtar kullanılır. İkame - yapay anlamına gelir, yani veritabanımızın tanımladığı veri alanında var olmayan ve veritabanı uygulamalarının geliştirilmesinin kolaylığı için yapay olarak oluşturulmuş. Daha önce belirtildiği gibi, genellikle bir sayaç birincil anahtardır. Paradox ve MS SQL gibi bazı DBMS’lerde sayaç (otomatik artış) adı verilen özel bir tür vardır. Tabloya yeni bir kayıt eklendiğinde, bu türle alan değeri otomatik olarak bir artış değeri kadar artar - genellikle birimler halinde. InterBase’de sayaç türünde bir alan yoktur, ancak bu davranış gerçekleştirilebilir. Tabloya kayıt eklerken otomatik olarak doldurulacak alanı oluşturmak için kaynak koleksiyonu kullanılır: bunlardan ilki jeneratördür.

Jeneratör nedir? Basit bir şekilde söylemek gerekirse, jeneratör adlandırılmış bir sayaçtır. Bir veritabanı içinde bir sayaç oluşturabilir, bu tabana özgü benzersiz bir ad verebilir ve bu sayacın değerlerini kontrol edebiliriz. Bu bir jeneratör olacaktır. İşte size bunu açıklayacak DDL ifadelerinin bir örneği:

CREATE GENERATOR g1; SET GENERATOR g1 TO 2445;

Bu örneğin ilk satırında g1 adında bir jeneratör oluşturulur ve ikinci satırda bu jeneratöre 2445 değeri atanır. Şimdi elde edilen jeneratörün nasıl kullanılacağı sorusu var. InterBase’de jeneratörlerin değerlerini almak ve değiştirmek için yerleşik bir GEN_ID işlevi vardır. Bu işlev parametre olarak jeneratörün adını ve verilen jeneratöre uygulanacak artış değerini alır ve artışın eklenmesi sonucunda elde edilen jeneratörün değerine karşılık gelen tamsayı değerini döndürür. İşte tetikleyicide veya saklı prosedürde GEN_ID işlev çağrısının bir örneği:

Current_value = GEN_ID (g1, 1)

Jeneratörün değerini almak istiyorsak, şu sorguyu kullanabiliriz:

SELECT GEN_ID(g1, 1)FROM RDB$ DATABASE

RDB $ Database tablosu her zaman yalnızca bir kayıt içerdiğinden, verilen sorgunun sonucunda g1 jeneratörünün değerini alacağız.

Burada current_value bir değişkendir (sonraki bölümlerde InterBase’de değişkenlerin nasıl kullanılacağı hakkında bilgi bulacaksınız), g1 - bir jeneratör, 1 - artış. Bu örnekte, g1 jeneratörünün değeri, artış 1 eklendikten sonra current_value değişkenine gidecektir, yani jeneratörün bir sonraki değeri. Dikkat edin, artış 1’e eşit olmak zorunda değildir! Üstelik negatif bile olabilir: Current_value = GEN_ID (g1, -23)

Bu işlevin yürütülmesi sonucunda g1 jeneratörünün mevcut değeri eksi 23 olacaktır. Gördüğünüz gibi, jeneratörlerin olası uygulama aralığı oldukça geniştir - yalnızca birincil anahtar değerlerini elde etmek için değil, aynı zamanda veritabanındaki genel değişiklikleri izlemek için de kullanılabilir.

Veritabanlarına aşina olan kişiler şu soruyu sorabilir: “Aynı anda birkaç istemci aynı tabloya veri koymaya çalışırsa ve aynı anda jeneratörleri ‘çekerse’ ne olur? Jeneratörün aynı mı yoksa farklı değerlerini mi alırlar?” Kesinlikle jeneratörün FARKLI değerlerini alacaklardır. Jeneratörün değerini alma girişimi ne kadar ’eşzamanlı’ olursa olsun, başvuran herkes benzersiz değeri alacaktır. Bu, jeneratörlerin ‘yapısı’ ile garanti edilir: sunucunun en alt seviyesinde çalışırlar ve kayıt ve ekleme işlemleri onları etkilemez - genellikle jeneratörlerin ‘işlem bağlamı dışında’ çalıştığı söylenir. İşlemler hakkında bilgi edinmek istiyorsanız, “İşlemler. İşlem parametreleri” bölümünü okuyun (bölüm 1); jeneratörlerin nasıl düzenlendiği - “InterBase veritabanı yapısı” (bölüm 4). Jeneratörler adına, benzersiz birincil anahtarlar oluşturmak için güvenilir bir mekanizmamız var. Ancak bu mekanizmayı kullanabilir miyiz? Jeneratörden alınan değeri birincil anahtar alanına nasıl koyarız?

Bu amaçla iki yol vardır - birincil anahtarı istemci adına ve sunucu adına eklemek. İlk yolu öğrenmek için “FIBPlus ana bileşenlerinin kullanımı” bölümüne başvurmalıyız ve ikinciyi anlamak için - “Tetikleyiciler” bölümüne (bölüm 1). Burada her iki yolun ana noktasını kısaca gözden geçireceğiz.

Birincil anahtarın istemci adına oluşturulması durumunda şunlar olur. Veritabanına eklenecek kayıt oluşturulduğunda, GEN_ID işlev çağrısı (, 1) yürütülür ve alınan değer bu kayda ikame edilir. Ardından tabloya ekleme yapılır ve benzersiz bir birincil anahtar almamız garanti edilir.

İkinci yol - birincil anahtarın sunucu adına oluşturulması - genel olarak istemcinin birincil anahtarın değerinin ne olacağı konusundaki tüm endişelerini ortadan kaldırır. Bu durumda kayıt eklerken tetikleyici çalışır - tablolardaki kayıtları eklerken/silerken/güncellerken herhangi bir işlemi gerçekleştirebilen özel bir veritabanı nesnesi. Ve bu tetikleyicide şu işlemler gerçekleştirilir: GEN_ID işlev çağrısı, gerekli jeneratör değerinin alınması ve tabloya eklenmesi. İkinci yolun avantajı, bir istemci uygulaması geliştirirken birincil anahtarın oluşturulması konusunda hiç endişelenmeye gerek olmamasıdır, tek yapmanız gereken gerekli tetikleyiciyi bir kez yazmaktır. Ancak dezavantajı, eklemeden hemen sonra uygulamada oluşturulan anahtarın değerini alamamamızdır! İlk yolu kullanırsak, birincil anahtarın değerini alabiliriz, ancak her eklemede oluşturulmasıyla ilgilenmemiz gerekir. Hangi yolun daha iyi olduğunu kesin olarak söylemek zordur, her şey belirli bir soruna bağlıdır. Bu kitabın devamında, birincil anahtarla çalışma konusundaki soruların çözümü için olası varyantları ele alacağız.

Sonuç

Bu bölümde, InterBase’de tabloların nasıl oluşturulacağını ve güncelleneceğini ve birincil anahtarların nasıl yönetileceğini inceledik. Böylece, InterBase’de koşullu olarak statik olarak adlandırılabilecek ana nesneleri ele aldık, çünkü bunlar yalnızca bilgiyi saklar ve dönüşümünü gerçekleştirmez. Daha sonra, bilgi kontrolü ve veritabanı içinde bilgi dönüşümü yolları hakkında konuşacağız.