• Veri tabanı. İlişkisel veritabanları Anahtar alanı yabancı anahtar veri bütünlüğü

    Son güncelleme: 27.04.2019

    Yabancı anahtarlar tablolar arasında ilişki kurmanıza olanak tanır. Bağımlı, alt tablodaki sütunlara bir yabancı anahtar ayarlanır ve ana tablodaki sütunlardan birine işaret eder. Genellikle yabancı anahtar, ilgili ana tablodaki birincil anahtara işaret eder.

    Tablo düzeyinde yabancı anahtar ayarlamanın genel sözdizimi şöyledir:

    YABANCI ANAHTAR (sütun1, sütun2, ... sütunN) REFERANSLAR ana_tablo (ana_tablo_sütun1, ana_tablo_sütun2, ... ana_tablo_sütunN)

    Yabancı anahtar kısıtlaması oluşturmak için FOREIGN KEY'den sonra yabancı anahtarı temsil edecek tablo sütununu belirtirsiniz. REFERENCES anahtar sözcüğünden sonra ilgili tablonun adı, ardından parantez içinde yabancı anahtarın işaret edeceği ilgili sütunun adı belirtilir. REFERENCES ifadesinin ardından sırasıyla ana tablodan bir satırın silinmesi ve güncellenmesi sırasında yapılacak işlemi belirten ON DELETE ve ON UPDATE ifadeleri bulunmaktadır.

    Örneğin, iki tablo tanımlayalım ve bunları yabancı anahtar kullanarak bağlayalım:

    CREATE TABLE Müşteriler (Id INT PRIMARY KEY AUTO_INCREMENT, Age INT, FirstName VARCHAR(20) NOT NULL, LastName VARCHAR(20) NOT NULL, Phone VARCHAR(20) NOT NULL UNIQUE); CREATE TABLO Siparişleri (Id INT PRIMARY KEY AUTO_INCREMENT, CustomerId INT, CreatedAt Date, FOREIGN KEY (CustomerId) REFERENCES Müşteriler (Id));

    Bu durumda Müşteriler ve Siparişler tabloları tanımlanır. Müşteriler asıl müşteridir ve müşteriyi temsil eder. Siparişler bağımlıdır ve müşteri tarafından verilen siparişi temsil eder. Siparişler tablosu, Müşteri Kimliği sütunu aracılığıyla Müşteriler tablosuna ve onun Kimlik sütununa bağlanır. Yani MüşteriKimliği sütunu, Müşteriler tablosundaki Kimlik sütununa işaret eden yabancı bir anahtardır.

    Yabancı anahtar kısıtlamasına bir ad belirtmek için CONSTRAINT operatörünü kullanabilirsiniz:

    CREATE TABLO Siparişleri (Id INT PRIMARY KEY AUTO_INCREMENT, CustomerId INT, CreatedAt Date, CONSTRAINT siparişler_custonmers_fk YABANCI ANAHTAR (CustomerId) REFERANSLAR Müşteriler (Id));

    SİLMEDE ve GÜNCELLEMEDE

    ON DELETE ve ON UPDATE deyimlerini kullanarak ilgili satırın sırasıyla silinmesi veya değiştirilmesi durumunda gerçekleştirilecek eylemleri ana tablodan ayarlayabilirsiniz. Aşağıdaki seçenekler bir eylem olarak kullanılabilir:

      CASCADE: Ana tablodaki ilgili satırlar silindiğinde veya değiştirildiğinde bağımlı tablodaki satırları otomatik olarak siler veya değiştirir.

      SET NULL: Ana tablodan ilgili satırı silerken veya güncellerken yabancı anahtar sütununu NULL olarak ayarlar. (Bu durumda yabancı anahtar sütununun NULL ayarını desteklemesi gerekir)

      RESTRICT: Bağımlı tabloda ilgili satırlar varsa, ana tablodaki satırların silinmesini veya değiştirilmesini reddeder.

      EYLEM YOK: RESTRICT ile aynı.

      SET DEFAULT: Ana tablodan ilgili satırı silerken, yabancı anahtar sütununu DEFAULT özelliği kullanılarak belirtilen varsayılan değere ayarlar. Bu seçenek prensipte mevcut olmasına rağmen InnoDB motoru bu ifadeyi desteklemiyor.

    Basamaklı silme

    Basamaklı silme, ana tablodan bir satırı sildiğinizde bağımlı tablodaki ilgili tüm satırları otomatik olarak silmenize olanak tanır. Bunu yapmak için CASCADE seçeneğini kullanın:

    CREATE TABLO Siparişleri (Id INT PRIMARY KEY AUTO_INCREMENT, CustomerId INT, CreatedAt Date, FOREIGN KEY (CustomerId) REFERANSLAR Müşteriler (Id) ON DELETE CASCADE);

    ON UPDATE CASCADE ifadesi de benzer şekilde çalışır. Birincil anahtarın değerini değiştirdiğinizde, ilişkili yabancı anahtarın değeri de otomatik olarak değişir. Ancak birincil anahtarlar çok nadir değiştiğinden ve genellikle birincil anahtar olarak değiştirilebilir değerlere sahip sütunların kullanılması önerilmediğinden ON UPDATE ifadesi pratikte nadiren kullanılır.

    NULL ayarı

    Bir yabancı anahtar için SET NULL seçeneğini ayarladığınızda, yabancı anahtar sütununun NULL'a izin vermesi gerekir:

    CREATE TABLO Siparişleri (Id INT PRIMARY KEY AUTO_INCREMENT, CustomerId INT, CreatedAt Date, FOREIGN KEY (CustomerId) REFERANSLAR Müşteriler (Id) ON DELETE SET NULL);

    Bu kitabın başlarında, tipik tabloların belirli alanları arasında var olan belirli ilişkilere dikkat çekmiştik. Örneğin Müşteriler tablosunun snum alanı, Satıcılar tablosundaki ve Siparişler tablosundaki snum alanına karşılık gelir. Müşteriler tablosunun cnum alanı aynı zamanda Siparişler tablosunun cnum alanına da karşılık gelir. Bu tür ilişkilere referans bütünlüğü adını verdik; ve tartışma sırasında bunun nasıl kullanılabileceğini gördünüz.

    Bu bölümde referans bütünlüğünü daha ayrıntılı olarak inceleyecek ve onu korumak için kullanabileceğiniz kısıtlamalar hakkında her şeyi öğreneceksiniz. Ayrıca DML değiştirme komutlarını kullandığınızda bu sınırlamanın nasıl geçerli olduğunu göreceksiniz. Referans bütünlüğü, alanları veya alan gruplarını genellikle farklı tablolar arasında ilişkilendirmeyi içerdiğinden, bu eylem diğer kısıtlamalardan biraz daha karmaşık olabilir. Bu nedenle, tablo oluşturmayı planlamıyor olsanız bile, ona tamamen aşina olmanız iyi olur. Değişiklik komutlarınız, bir referans bütünlüğü kısıtlaması (diğer kısıtlamalarda olduğu gibi, ancak bir referans bütünlüğü kısıtlaması, tanımlandığı tablolar dışındaki tabloları etkileyebilir) ve birleştirmeler gibi belirli sorgu işlevleri yinelemeli olarak yapılandırılarak daha verimli hale getirilebilir. referans bütünlük ilişkileri açısından (Bölüm 8'de vurgulandığı gibi).

    YABANCI ANAHTAR VE EBEVEYN ANAHTARI

    Bir tablo alanındaki tüm değerler başka bir tablodaki bir alanda temsil edildiğinde ilk alanın ikinciye gönderme yaptığını söyleriz. Bu, iki alanın değerleri arasında doğrudan bir ilişki olduğunu gösterir. Örneğin, Müşteriler tablosundaki müşterilerin her birinin, Satıcılar tablosunda atanan satıcıyı gösteren bir snum alanı vardır. Siparişler tablosundaki her sipariş için bir ve tek bu satıcı ve bir ve sadece bu müşteri vardır. Bu, Siparişler tablosundaki snum ve cnum alanları kullanılarak görüntülenir.

    Bir tablodaki bir alan diğerine atıfta bulunduğunda buna yabancı anahtar denir; ve onun başvurduğu alana ana anahtar adı verilir. Yani Müşteriler tablosunun snum alanı yabancı bir anahtardır ve Satıcılar tablosunda başvuruda bulunduğu snum alanı ise ana anahtardır.

    Benzer şekilde, Siparişler tablosunun cnum ve snum alanları, Müşteriler tablosunda ve Satıcılar tablosunda adlandırılan üst anahtarlarına başvuran yabancı anahtarlardır. Yabancı anahtarın ve ana anahtarın adlarının aynı olması gerekmez; bu yalnızca birleştirmeyi daha net hale getirmek için takip ettiğimiz bir kuraldır.

    ÇOK SÜTUNLU YABANCI ANAHTARLAR

    Gerçekte yabancı anahtarın yalnızca tek bir cinsiyetten oluşması gerekmez. Birincil anahtar gibi, yabancı anahtar da hepsi tek bir birim olarak ele alınan herhangi bir sayıda alana sahip olabilir. Yabancı anahtar ve onun atıfta bulunduğu ana anahtarın elbette aynı numaraya ve cinsiyet türüne sahip olması ve aynı sırada olması gerekir. Tek cinsiyetten oluşan yabancı anahtarlar (özel olarak standart tablolarımızda kullandığımız anahtarlar) en yaygın olanlardır. Tartışmamızı basit tutmak için yabancı anahtara sıklıkla tek bir sütun olarak değineceğiz. Bu bir tesadüf değil. Eğer bu dikkate alınmazsa, yabancı anahtar olan bir alanın aynı zamanda yabancı anahtar olan bir alan grubuna ait olduğunu herkes söyleyebilir.

    YABANCI VE EBEVEYN ANAHTARLARININ ANLAMI

    Bir alan yabancı anahtar olduğunda, bir şekilde başvurduğu tabloyla ilişkilidir. Esasen söylediğiniz şey şu: "Bu alandaki her değer (yabancı anahtar) doğrudan başka bir alandaki (ana anahtar) bir değere bağlıdır." Bir yabancı anahtarın her değeri (her satır), açık bir şekilde üst anahtarın yalnızca bir değerine (satırına) atıfta bulunmalıdır. Eğer durum buysa, o zaman aslında sisteminiz, dedikleri gibi, referans bütünlüğü durumunda olacaktır. Bunu bir örnekle görebilirsiniz. Müşteriler tablosundaki yabancı anahtar sayısı, Hoffman ve Clemens satırları için 1001 değerine sahiptir. Satıcılar tablosunda alan değeri snum = 1001 olan iki satırımız olduğunu varsayalım. Hoffman ve Clemens müşterilerinin iki satıcıdan hangisine atandığını nasıl bileceğiz? Benzer şekilde, Satıcılar tablosunda bu tür satırlar yoksa, Hoffman ve Clemens'in var olmayan bir satıcıya atanmasıyla sonuçlanırız!

    Yabancı anahtardaki her değerin ana anahtarda bir kez ve yalnızca bir kez temsil edilmesi gerektiği açıktır.

    Aslında, belirli bir yabancı anahtar değeri, tersi mümkün olmaksızın yalnızca bir ana anahtar değerine atıfta bulunabilir: yani. herhangi bir sayıda yabancı anahtar, tek bir ana anahtar değerine başvurabilir. Bunu örneklerimizin tipik tablolarında görebilirsiniz. Hem Hoffman hem de Clemens Peel'e atanmıştır, dolayısıyla yabancı anahtar değerlerinin her ikisi de aynı ana anahtarla aynıdır ve bu iyi bir şeydir. Bir yabancı anahtar değeri yalnızca bir ana anahtar değerine referans vermelidir, ancak bir ana anahtar değerine herhangi bir sayıda yabancı anahtar değeri tarafından başvurulabilir. Örnek olarak, Satıcılar tablosundaki ana anahtarlarıyla eşleşen Müşteriler tablosundaki yabancı anahtar değerleri Şekil 19.1'de gösterilmektedir. Kolaylık olması açısından bu örnekle ilgisi olmayan cinsiyeti dikkate almadık.

    YABANCI ANAHTAR SINIRLAMASI

    SQL, FOREIGN KEY kısıtlamasıyla referans bütünlüğünü korur. FOREIGN KEY kısıtlaması SQL'de yeni bir özellik olmasına rağmen henüz onu evrensel kılmamaktadır. Ayrıca bazı uygulamaları diğerlerinden daha karmaşıktır. Bu işlev, yabancı anahtarın ve ana anahtarın referans bütünlüğüne uymasını sağlamak için veritabanınıza girebileceğiniz değerleri sınırlamalıdır. Yabancı Anahtar kısıtlamasının eylemlerinden biri, halihazırda ana anahtarda temsil edilmeyen, yabancı anahtar olarak sınırlandırılmış alanlara ilişkin değerlerin atılmasıdır. Bu kısıtlama aynı zamanda ana anahtar değerlerini değiştirme veya silme yeteneğinizi de etkiler (bu konuyu daha sonra bu bölümde tartışacağız).

    ALANLAR NASIL YABANCI ANAHTAR OLARAK GÖSTERİLEBİLİR?

    Yabancı anahtar olarak bildirmek istediğiniz alanı içeren CREATE TABLE (veya ALTER TABLE) komutunda FOREIGN KEY kısıtlamasını kullanırsınız. Onlara FOREIGN KEY kısıtlaması içinde başvuracağınız ana anahtarı verirsiniz. Bu kısıtlamanın komuta yerleştirilmesi, önceki bölümde tartışılan diğer kısıtlamalarla aynıdır. Şekil 19.1: Müşteri tablosunun ebeveyn anahtarlı Yabancı Anahtarı

    Çoğu kısıtlama gibi, birden fazla alanın tek bir yabancı anahtar olarak kullanılmasına izin veren tablo biçiminde bir tablo veya sütun kısıtlaması olabilir.

    TABLO KISITLAMASI OLARAK YABANCI ANAHTAR

    FOREIGN KEY tablo kısıtlaması sözdizimi: FOREIGN KEY REFERANSLAR [ ] İlk sütun listesi, bu komut tarafından oluşturulacak veya değiştirilecek bir veya daha fazla tablo sütununun virgülle ayrılmış listesidir. Pktable, ana anahtarı içeren tablodur. Geçerli komut tarafından oluşturulan veya değiştirilen bir tablo olabilir. İkinci sütun listesi ana anahtarı oluşturacak sütunların listesidir. İki sütun listesinin uyumlu olması gerekir, yani:

    * Aynı sayıda sütuna sahip olmalıdırlar.

    * Bu sıralamada, yabancı anahtar sütun listesinin birinci, ikinci, üçüncü vb. sütunları, ana anahtar sütun listesinin birinci, ikinci, üçüncü vb. sütunlarıyla aynı veri türlerine ve boyutlarına sahip olmalıdır. Her ne kadar ilişkiyi daha net hale getirmek için örneklerimizde bu yöntemi kullanmış olsak da, her iki sütunun listesindeki sütunlar aynı adlara sahip olmamalıdır.

    Satıcılar tablosuna referans veren yabancı anahtar olarak tanımlanan snum alanına sahip bir Müşteriler tablosu oluşturalım: CREATE TABLE Müşteriler (cnum integer NOT NULL PRIMARY KEY cname char(10), city char(10), snum integer, FOREIGN KEY (snum) REFERENCES Satış görevlileri (snum ); CREATE TABLE yerine ALTER TABLE kullanırken FOREIGN KEY kısıtlamasının uygulanabilmesi için, yabancı anahtar ve ana anahtarda belirttiğiniz değerlerin referans bütünlük durumunda olması gerektiğini unutmayın, aksi takdirde komut Her ne kadar ALTER TABLE çok kullanışlı olsa da, kolaylık olması açısından, sisteminizde mümkün olduğunca her zaman referans bütünlüğü gibi yapısal ilkeleri formüle etmeniz gerekecektir.

    SÜTUN KISITLAMASI OLARAK YABANCI ANAHTAR

    Bir sütunu FOREIGN KEY kısıtlamasıyla sınırlama seçeneği aynı zamanda REFERENCES kısıtlaması olarak da adlandırılır, çünkü aslında FOREIGN KEY kelimelerini içermez, ancak yalnızca REFERENCES kelimesini ve ardından ana anahtarı şu şekilde kullanır: CREATE TABLE Müşteriler ( cnum) integer NOT NULL PRIMARY KEY, cname char(10), city char(10), snum integer REFERANSLAR Satış görevlileri (snum)); Yukarıdakiler, Customers.snum'u ana anahtarı Salesperson.snum olan yabancı bir anahtar olarak tanımlar. Bu, şuna benzer bir tablo kısıtlamasına eşdeğerdir: FOREIGN KEY (snum) REGERENCES Satış görevlileri (snum)

    BİRİNCİL ANAHTAR SÜTUNLARIN LİSTESİNİ BELİRTMEYİN

    Bir tablo veya sütunda FOREIGN KEY kısıtlaması kullanarak, ana anahtarın PRIMARY KEY kısıtlaması varsa ana anahtarın sütun listesini atlayabilirsiniz. Doğal olarak, birçok alana sahip anahtarlar söz konusu olduğunda, yabancı ve birincil anahtarlardaki sütunların sırası eşleşmelidir ve her durumda, iki anahtar arasındaki uyumluluk ilkesi hâlâ geçerlidir. Örneğin, Sales tablosunun snum alanına PRIMARY KEY kısıtlaması yerleştirmiş olsaydık, bunu Customers tablosunda (önceki örneğe benzer şekilde) şu komutla yabancı anahtar olarak kullanabilirdik: CREATE TABLE Customers (cnum integer NOT NULL) PRIMARY KEY, cname char(10) , city char(10), snum integer REFERANSLAR Satış görevlileri); Bu özellik, birincil anahtarları ana anahtar olarak kullanmanızı teşvik etmek için dilin içine yerleştirilmiştir.

    REFERANS BÜTÜNLÜĞÜ BİR EBEVEYN ANAHTARININ DEĞERLERİNİ NASIL KISITLIYOR?

    Referans bütünlüğünü korumak, yabancı anahtar ve ana anahtar olarak bildirilen alanlarda temsil edilebilecek değerler üzerinde bazı kısıtlamalar gerektirir. Ana anahtar, her yabancı anahtar değerinin belirli bir satıra karşılık gelmesini sağlayacak şekilde yapılandırılmalıdır. Bu, (anahtarın) benzersiz olması ve herhangi bir boş değer (NULL) içermemesi gerektiği anlamına gelir. Yabancı anahtar bildirilirken aynı gereksinim karşılanıyorsa, bu ana anahtar için yeterli değildir. SQL, ana anahtara çift değerlerin veya boş değerlerin girilmemesini sağlamalıdır. Bu nedenle, ana anahtar olarak kullanılan tüm alanların ya bir PRIMARY KEY kısıtlamasına ya da NOT NULL kısıtlaması gibi bir UNIQUE kısıtlamasına sahip olduğundan emin olmalısınız.

    BENZERSİZ BİR YABANCI ANAHTAR OLARAK BİRİNCİL ANAHTAR

    Standart tablolarda yaptığımız gibi yabancı anahtarlarınızı yalnızca birincil anahtarlara bağlamak iyi bir stratejidir. Yabancı anahtarları kullandığınızda, onları yalnızca başvurdukları ana anahtarlarla ilişkilendirmezsiniz; bunları ana anahtarın bulunacağı belirli bir tablo satırıyla ilişkilendirirsiniz. Ana anahtarın kendisi, yabancı anahtarda mevcut olmayan herhangi bir bilgiyi sağlamaz. Örneğin, Müşteriler tablosunda yabancı anahtar olarak sex snum'un anlamı, atıfta bulunduğu sex snum'un değeriyle değil, Satış tablosundaki müşteri adları gibi diğer bilgilerle sağladığı ilişkidir. satış elemanları, konumları vb. Yabancı anahtar yalnızca iki özdeş değer arasındaki ilişki değildir; bu, sorguda belirtilen tablonun iki satırı arasında bu iki değeri kullanan bir ilişkidir. Bu snum alanı, Müşteriler tablosundaki herhangi bir satırı Satıcılar tablosundaki bir referans satırıyla ilişkilendirmek için kullanılabilir; örneğin, aynı şehirde yaşayıp yaşamadıklarını, kimin daha uzun bir isme sahip olduğunu, satıcının başka bir adı olup olmadığını öğrenmek için. bu müşterinin dışındaki diğer müşteriler, müşteriler vb. Birincil anahtarın amacı bir satırın benzersizliğini belirlemek olduğundan, yabancı anahtar için daha mantıklı ve daha az belirsiz bir seçimdir. Ana anahtarı olarak benzersiz bir anahtar kullanan herhangi bir yabancı anahtar için, aynı etki için aynı tablonun birincil anahtarını kullanan bir yabancı anahtar oluşturmanız gerekir. Satırları bağlamaktan başka bir amacı olmayan yabancı anahtar, yalnızca satırları tanımlamak için kullanılan birincil anahtara benzer ve veritabanınızın yapısını açık ve basit, dolayısıyla daha az karmaşık tutmanın iyi bir yoludur.

    YABANCI ANAHTAR KISITLAMALAR

    Özellikle yabancı anahtar yalnızca ana anahtarda gerçekten mevcut olan veya boş (NULL) değerleri içerebilir. Bu anahtara başka değerler girme girişimleri reddedilecektir. Bir yabancı anahtarı NOT NULL olarak bildirebilirsiniz, ancak bu gerekli değildir ve çoğu durumda istenmeyen bir durumdur. Örneğin, hangi satış elemanına atanacağını önceden bilmeden bir müşteri girdiğinizi varsayalım. Bu durumda en iyi çıkış yolu, daha sonra belirli bir değere değiştirilmesi gereken NOT NULL değerini kullanmaktır.

    BİR DEĞİŞİKLİK KOMUTUNUN UYGULANMASI DURUMUNDA NE OLUR?

    Örnek tablolarımızda oluşturulan tüm yabancı anahtarların aşağıdaki gibi yabancı anahtar kısıtlamalarıyla bildirildiğini ve uygulandığını varsayalım: CREATE TABLE Satış görevlileri (snum integer NOT NULL PRIMARY KEY, sname char(10) NOT NULL, city char(10) , comm decimal ); CREATE TABLE Müşteriler (cnum tamsayı NOT NULL PRIMARY KEY, cname char(10) NOT NULL, şehir karakteri(10), derecelendirme tamsayı, snum tamsayı, YABANCI ANAHTAR (snum) REFERANSLAR Satış görevlileri, UNIQUE (cnum, snum) ; CREATE TABLE Siparişleri ( cnum integer NULL DEĞİL BİRİNCİL ANAHTAR, amt ondalık, oda tarihi NULL DEĞİL, cnum integer NULL DEĞİL snum integer NULL DEĞİL YABANCI ANAHTAR (cnum, snum) REFERANSLAR MÜŞTERİLER (cnum, snum);

    TABLO AÇIKLAMALARI DAHİL

    Bu tür tanımların tartışılması gereken çeşitli özellikleri vardır. Siparişler tablosundaki cnum ve snum tabanlarını tek bir yabancı anahtar yapmaya karar vermemizin nedeni, siparişlerde yer alan her müşteri için bu siparişi alacaklandıran satıcının Müşteriler tablosunda belirtilenle aynı olmasını sağlamaktır. Böyle bir yabancı anahtar oluşturmak için, Müşteri tablosunun iki katına, bu tablonun kendisi için gerekli olmasa da, bir UNIQUE tablo kısıtlaması yerleştirmemiz gerekir. Bu tablodaki cnum alanı PRIMARY KEY kısıtlamasına sahip olduğu sürece her durumda benzersiz olacaktır ve bu nedenle cnum alanının başka bir alanla başka bir kombinasyonunu elde etmek imkansızdır. Bu şekilde bir yabancı anahtar oluşturmak, yanlışlıkla dahili olarak kesintiye uğramanızı ve söz konusu müşteriye atanan satıcının dışındaki herhangi bir satıcıya kredi vermenizi engellese bile, veritabanının bütünlüğünü korur.

    Veritabanı bütünlüğünün korunması açısından bakıldığında, dahili kesintiler (veya istisnalar) elbette istenmeyen bir durumdur. Bunlara izin veriyorsanız ve aynı zamanda veritabanınızın bütünlüğünü korumak istiyorsanız, Siparişler tablosundaki snum ve cnum alanlarını sırasıyla Satıcılar tablosunda ve Müşteriler tablosunda bu alanların bağımsız yabancı anahtarları olarak bildirebilirsiniz. Aslında yaptığımız gibi Order tablosunda sex snum'u kullanmak gerekli olmasa da çeşitlilik açısından bunu yapmak faydalı olacaktır. Müşteri tablosundaki, Sipariş tablosundaki ve Müşteri tablosundaki her müşteri siparişini bağlayan cnum alanı, o sipariş için doğru snum alanını bulmak amacıyla (herhangi bir istisnaya izin vermeden) her zaman paylaşılmalıdır. Bu, hangi müşterinin hangi satıcıya atandığı bilgisini iki kez kaydettiğimiz ve her iki versiyonun da tutarlı olduğundan emin olmak için ek çalışmalar yapılması gerektiği anlamına gelir. Yukarıda belirtildiği gibi bir yabancı anahtar kısıtlamamız yoksa, bu durum özellikle sorunlu olacaktır çünkü ilgili satıcının ilgili her satışı kredilendirdiğinden emin olmak için her siparişin (sorguyla birlikte) manuel olarak kontrol edilmesi gerekecektir. Veritabanınızda bu tür bilgi fazlalığına sahip olmak, denormalizasyon olarak adlandırılır; bu, ideal bir ilişkisel veritabanında istenmeyen bir durumdur, ancak pratikte çözülebilir. Bir tablodaki sorgu her zaman birleşimdeki sorgudan çok daha hızlı olduğundan demoralizasyon bazı sorguların daha hızlı çalışmasına neden olabilir.

    KISITLAMALARIN ETKİSİ

    Bu tür kısıtlamalar DML değişiklik komutlarını kullanma yeteneğinizi ve kullanamama yeteneğinizi nasıl etkiler? Yabancı anahtar olarak tanımlanan alanlar için cevap oldukça basittir: INSERT veya UPDATE komutuyla bu alanlara koyduğunuz değerlerin ana anahtarlarında zaten mevcut olması gerekir. Bu alanlara NULL değerler yerleştirebilirsiniz, ancak NOT NULL kısıtlaması varsa üst anahtarlarda NULL değerlere izin verilmez. Ana anahtarları kullanmadan, yabancı anahtarlara sahip herhangi bir satırı SİLEBİLİRSİNİZ.

    Ana anahtar değerlerinin değiştirilmesi sorunu gündeme geldiğinden, ANSI tarafından tanımlandığı şekliyle yanıt daha da basittir, ancak belki de biraz daha sınırlıdır: yabancı anahtar değeri tarafından başvurulan herhangi bir ana anahtar değeri silinemez veya değiştirilemez. Bu, örneğin, Siparişler tablosunda hâlâ siparişleri bulunan bir müşteriyi Müşteriler tablosundan kaldıramayacağınız anlamına gelir. Bu tabloları nasıl kullandığınıza bağlı olarak bu arzu edilebilir veya zahmetli olabilir. Ancak bu, mevcut siparişleri olan bir müşteriyi silmenize ve Siparişler tablosunu mevcut olmayan müşterilere referans vererek bırakmanıza olanak tanıyan bir sisteme sahip olmaktan kesinlikle daha iyidir. Bu kısıtlama sisteminin amacı, Siparişler tablosunu oluşturan kişinin Müşteriler tablosunu ve Satıcılar tablosunu ana anahtar olarak kullanarak bu tablolardaki eylemlere önemli kısıtlamalar getirebilmesidir. Bu nedenle, kontrol etmediğiniz (yani onu oluşturmadığınız ve sahibi olmadığınız) bir tabloyu, o tablonun sahibi (yaratıcısı) size özel olarak kullanma hakkını verene kadar kullanamayacaksınız. yani (Bölüm 22'de açıklandığı gibi). ANSI'nin parçası olmayan ancak bazı ticari programlarda bulunabilecek başka olası ana anahtar değiştirme eylemleri de vardır. Bir ana anahtarın geçerli referans değerini değiştirmek veya silmek istiyorsanız esasen üç olasılık vardır:

  • Ana anahtardaki değişikliklerin kısıtlandığını belirterek değişiklikleri (ANSI tarzında) kısıtlayabilir veya yasaklayabilirsiniz.
  • Ana anahtarda bir değişiklik yapabilir ve böylece yabancı anahtarda otomatik olarak değişiklik yapabilirsiniz, buna basamaklı değişiklik denir.
  • Ana anahtarda bir değişiklik yapabilir ve yabancı anahtarı otomatik olarak NULL olarak ayarlayabilirsiniz (yabancı anahtarda NULLS'a izin verildiği varsayılarak), buna boş yabancı anahtar değişikliği adı verilir.

    Bu üç kategori içinde bile tüm değişiklik komutlarını bu şekilde işlemek istemeyebilirsiniz. INSERT elbette alakasız. Ana anahtarın yeni değerlerini tabloya koyar, böylece bu değerlerin hiçbiri o an çağrılamaz. Ancak, değişikliklerin silme olmadan basamaklandırılmasına (veya bunun tersi) izin vermek isteyebilirsiniz. UPDATE ve DELETE komutlarından bağımsız olarak üç kategoriden herhangi birini tanımlamanıza olanak tanıyan durum daha iyi olabilir. Bu nedenle, bir ana anahtara UPDATE veya DELETE komutu verdiğinizde ne olacağını belirleyen güncelleme efektlerine ve silme efektlerine değineceğiz. Bahsettiğimiz bu etkilerin isimleri: RESTRICTED değişiklikler, CASCADES değişiklikler ve NULL değişikliklerdir. Yukarıda açıklanan daha ideal durum için sisteminizin gerçek yetenekleri katı ANSI standardı dahilinde olmalıdır - değişiklik ve silme etkilerinin her ikisi de otomatik olarak sınırlıdır -. Açıklamak için, çok çeşitli değiştirme ve kaldırma efektleriyle neler yapabileceğinize dair birkaç örnek göstereceğiz. Elbette standart olmayan araçlar olan değiştirme ve silme efektleri standart durum sözdiziminden yoksundur. Burada kullandığımız sözdiziminin yazılması kolaydır ve bu efektlerin işlevlerini daha iyi açıklamaya hizmet edecektir.

    Deneyin eksiksiz olması açısından, Satıcılar tablomuzun bölümleri değiştirmesi durumunda, Satıcılar tablosunun snum alanını değiştirmek için bir nedeniniz olduğunu varsayalım. (Birincil anahtarları değiştirmek genellikle pratikte yapmanızı önerdiğimiz bir şey değildir. Bu, birincil anahtar görevi görmekten başka bir şey yapmayı bilmeyen mevcut birincil anahtarların başka bir nedenidir: değişmemeleri gerekir.) Satıcıyı değiştirdiğinizde numarasını kullanarak tüm müşterilerinin kaydedilmesini istiyorsunuz. Ancak bu satış elemanı firmasından veya şirketinden ayrılırsa onu veri tabanından çıkarırken müşterilerini de çıkarmak istemeyebilirsiniz. Bunun yerine müşterilerin başka birine atandığından emin olmak isteyeceksiniz. Bunu yapmak için, Basamaklı efektle GÜNCELLEME'yi ve Sınırlı efektle SİL'i belirtmeniz gerekir. CREATE TABLO Müşteriler (cnum integer NOT NULL PRIMARY KEY, cname char(10) NOT NULL, city char(10), rating integer, snum integer REFERANSLAR Satış Görevlileri, Satış Görevlilerinin GÜNCELLENMESİ, SINIRLI Satış Görevlilerinin SİLİNMESİ); Şimdi Peel'i Satıcılar tablosundan kaldırmaya çalışırsanız, başka bir atanmış satıcı için Hoffman ve Clemens müşterilerinin sex snum değerini değiştirene kadar komut geçerli olmayacaktır. Öte yandan Peel'in sex snum değerini 1009 olarak değiştirebilirsiniz; Hoffman ve Clemens de otomatik olarak değişecektir.

    Üçüncü etki Boş (NULL) değişikliklerdir. Satıcılar bir şirketten ayrıldığında mevcut siparişleri başka bir satıcıya aktarılmaz. Öte yandan hesaplarını sildiğiniz müşterilerin tüm siparişlerini otomatik olarak iptal etmek istiyorsunuz. Satıcının veya müşterinin numaralarını değiştirerek kolayca ona aktarabilirsiniz. Aşağıdaki örnek, bu efektleri kullanarak nasıl Sıra tablosu oluşturabileceğinizi gösterir. TABLO Siparişleri OLUŞTURUN (onum tamsayı BOŞ BİRİNCİL ANAHTAR DEĞİL, amt ondalık, oda tarihi NULL DEĞİL cnum tamsayı BOŞ REFERANSLAR DEĞİL Müşteriler snum tamsayı REFERANSLAR Satış Görevlileri, Müşteri basamaklarının güncellenmesi, Müşteri basamaklarının silinmesi, satış personeli basamaklarının güncellenmesi, satış görevlilerinin boş değerlerinin silinmesi); Elbette, Vendors tablosundaki Empty değişikliğin etkisine sahip bir DELETE komutunda, NOT NULL kısıtlamasının snum alanından kaldırılması gerekir.

    KONU TABLOLARINA REFERANS VEREN YABANCI ANAHTARLAR

    Daha önce de belirtildiği gibi, FOREIGN KEY kısıtlaması bu özel tabloyu ana anahtar tablosu olarak temsil edebilir. Basit olmaktan çok uzak olan bu özellik kullanışlı olabilir. Yönetici alanına sahip bir Çalışanlar tablomuz olduğunu varsayalım. Bu alan, bazıları yönetici olan her çalışanın numarasını içerir. Ancak her yönetici aynı zamanda çalışan olarak kaldığı için doğal olarak bu tabloda da temsil edilecektir. Çalışan numarasının (empno adında bir sütun) birincil anahtar olarak bildirildiği ve yöneticinin yabancı anahtar olarak buna referans vereceği bir tablo oluşturalım: CREATE TABLE Employees (empno integer NOT NULL PRIMARY KEY, name char(10) NOT NULL UNIOUE , yönetici tamsayı REFERANSLAR Çalışanlar); (Yabancı anahtar tablonun başvurulan birincil anahtarı olduğundan sütun listesi hariç tutulabilir.) Bu tablonun içeriği bulunmaktadır: EMPNO NAME MANAGER _____ ________ _______ 1003 Terrence 2007 2007 Atali NULL 1688 McKenna 1003 2002 Collier 2007 As you Görüldüğü gibi bunların her biri (Atali değil) tablodaki başka bir çalışanı kendi yöneticisi olarak ifade ediyor. Tabloda en yüksek sayıya sahip olan Atali'nin değerinin NULL olması gerekmektedir. Bu, referans bütünlüğünün başka bir ilkesini verir. Özel bir tabloya geri başvuran bir yabancı anahtarın değerlere izin vermesi gerekir = NULL. Durum böyle değilse ilk satırı nasıl eklersiniz? Bu ilk satır kendisine atıfta bulunsa bile, yabancı anahtar değeri girildiğinde ana anahtarın değerinin zaten ayarlanmış olması gerekir. Bu prensip, yabancı anahtarın özel tabloya doğrudan değil de başka bir tabloya gönderme yaparak geri gönderme yapması durumunda ve bu tablo daha sonra yabancı anahtar tablosuna geri gönderme yapsa bile geçerli olacaktır. Örneğin, Satış tablomuzun Müşteriler tablosuna başvuruda bulunan ek bir alana sahip olduğunu ve böylece aşağıdaki CREATE TABLE ifadesinde gösterildiği gibi her tablonun diğerine başvuruda bulunduğunu varsayalım: CREATE TABLE Satış görevlileri (snum integer NOT NULL PRIMARY KEY, sname char(10) NOT NULL, şehir karakteri(10), comm declmal, cnum tamsayı REFERANSLAR Müşteriler); CREATE TABLE Müşteriler (cnum integer NOT NULL PRIMARY KEY, cname char(10) NOT NULL, city char(10), rating integer, snum integer REFERANSLAR Satış görevlileri); Buna çapraz referans denir. SQL bunu teoride desteklemektedir ancak pratikte bu bir sorun olabilir. Bu iki tablodan hangisi önce oluşturulursa diğeri için henüz var olmayan bir referans tablosudur. Çapraz referanslama açısından, SQL aslında buna izin verir, ancak her ikisi de oluşturulma sürecindeyken tablolardan hiçbiri kullanılamaz. Öte yandan iki tablonun farklı kullanıcılar tarafından oluşturulması durumunda sorun daha da zorlaşır. Çapraz referanslama yararlı bir araç olabilir, ancak belirsizlik ve tehlikelerden de uzak değildir. Örneğin önceki örnek tamamen kullanılabilir değildir çünkü satıcıyı tek bir müşteriyle sınırlandırır ve bunu başarmak için çapraz referans kullanılması gerekli değildir. Çapraz referans bütünlük sistemi oluşturmadan önce, kullanımında dikkatli olmanızı ve programlarınızın değişiklik ve silme etkilerini, ayrıca ayrıcalıklar ve etkileşimli sorgu işleme süreçlerini nasıl yönettiğini analiz etmenizi öneririz. (Ayrıcalıklar ve etkileşimli istek işleme sırasıyla Bölüm 22 ve 1'de ele alınacaktır.)

    ÖZET

    Artık referans bütünlüğü üzerinde oldukça iyi bir kontrole sahipsiniz. Temel fikir, tüm yabancı anahtar değerlerinin belirtilen ana anahtar satırına atıfta bulunmasıdır. Bu, her yabancı anahtar değerinin ana anahtarda bir kez ve yalnızca bir kez temsil edilmesi gerektiği anlamına gelir. Yabancı anahtara bir değer yerleştirildiğinde, değerinin temsil edildiğinden emin olmak için ana anahtar kontrol edilir; aksi takdirde komut reddedilecektir. Değerin birden fazla kez temsil edilmemesini sağlamak için ana anahtarın PRIMARY KEY veya UNIQUE kısıtlamasına sahip olması gerekir. Halihazırda yabancı bir anahtarda temsil edilen bir ana anahtar değerini değiştirme girişimi tamamen reddedilecektir. Ancak sisteminiz size yabancı anahtarın değerini NULL olarak ayarlama veya ana anahtarın yeni değerini alma ve UPDATE ve DELETE komutları için hangisinin bağımsız olarak elde edilebileceğini belirleme seçeneği sunabilir. Bu, CREATE TABLE komutu hakkındaki tartışmamızı sonlandırıyor. Şimdi size başka bir komut türü olan CREATE'i tanıtacağız. Bölüm 20'de, tablo gibi görünen ve hareket eden ancak aslında sorguların sonuçları olan veri nesnelerini nasıl temsil edeceğinizi öğreneceksiniz. Bazı kısıtlama işlevleri görünümler tarafından da gerçekleştirilebilir; böylece sonraki üç bölümü okuduktan sonra kısıtlamalara olan ihtiyacınızı daha iyi değerlendirebileceksiniz.

    SQL'LE ÇALIŞMAK

    1. Cityorders adında bir tablo oluşturun. Siparişler tablosuyla aynı onum, amt ve snum alanlarını, Müşteriler tablosuyla aynı cnum ve şehir alanlarını içermelidir; böylece her müşterinin siparişi şehriyle birlikte bu tabloya girilir. Onum alanı Cityorders'ın birincil anahtarı olacaktır. Cityorders'taki tüm katlar, Müşteriler ve Siparişler tablolarıyla karşılaştırıldığında kısıtlamalara sahip olmalıdır. Bu tablolardaki ana anahtarların zaten uygun kısıtlamalara sahip olması mümkündür.

    2. Sorunu karmaşıklaştıralım. Siparişler tablosunu şu şekilde yeniden tanımlayın: mevcut müşteri için önceki siparişin onum alanı olan her sipariş için tanımlanacak olan prev adında yeni bir sütun ekleyin. Bunu Sipariş tablosunun kendisine başvuran bir yabancı anahtar kullanarak yapın. Yabancı anahtar aynı zamanda müşterinin cnum alanına da referans vermeli ve mevcut sipariş ile referans verilen sipariş arasında önceden belirlenmiş belirli bir ilişki sağlamalıdır.

    (Cevaplar için Ek A'ya bakın.)

  • InterBase aşağıdaki kısıtlama türlerini kullanabilir:
    • PRIMARY KEY – tablonun birincil anahtarı.
    • EŞSİZ - benzersiz tablo anahtarı.
    • YABANCI ANAHTAR- yabancı anahtar, başka bir tabloya bağlantı sağlar ve ana öğe ile ana öğe arasındaki referans bütünlüğünü garanti eder çocuk masaları.

    Terminoloji üzerine bir not

    Eğer siz de bu kursun yazarı gibi ilginizi çeken bir sorunun yanıtlarını farklı yazarların farklı eserlerinde aramayı seviyorsanız, tanımlardaki bazı karışıklıkları fark etmeden duramazsınız. ana (ana) -> ast (detay) tablolar. Ana tablonun sıklıkla ana tablo, alt tablonun ise alt tablo olarak adlandırıldığını hatırlayın.

    Bunun nedeni muhtemelen bu tanımların yerel ve SQL sunucu DBMS'lerinde nasıl yorumlandığından kaynaklanmaktadır.

    Yerel DBMS'lerde ana tablo, ana verileri içeren tablodur ve alt tablo, ek verileri içerir. Örneğin birbiriyle ilişkili üç tabloyu ele alalım. Birincisi satışlara ilişkin verileri, ikincisi ürünlere ve üçüncüsü müşterilere ilişkin verileri içerir:


    Pirinç. 18.1.

    Burada ana bilgiler satış tablosunda saklanır, dolayısıyla ana (ana) tablodur. Ürün ve müşteri tablolarında ek bilgiler depolanır, bu da onların çocuk olduğu anlamına gelir. Bu anlaşılabilir bir durumdur: Bir kızın iki biyolojik annesi olamaz, ancak bir anne iki kız çocuğu doğurma konusunda oldukça yeteneklidir.

    Ancak SQL veritabanı sunucularında ilişkilerin farklı bir tanımı vardır: bir tablodaki bir alan başka bir tablodaki bir alana atıfta bulunduğunda buna denir. yabancı anahtar. Ve onun atıfta bulunduğu alana denir ebeveyn veya birincil anahtar. Yabancı anahtarı olan bir tabloya (başka bir tablodaki kayda bağlantı) genellikle alt öğe denir ve bu tabloya ebeveyn anahtarı- ebeveyn. Ayrıca ilişkilerin tanımında, bir ebeveynin yalnızca tek bir benzersiz kayda sahip olabileceği ve bu kayda birden fazla kayıt tarafından başvurulabileceği belirtiliyor. çocuk masası.

    Yukarıdaki örnekte satış tablosunun iki yabancı anahtarı vardır: ürün kimliği ve müşteri kimliği. Ve şeklin sağ tarafındaki her iki tablo da ebeveyn anahtarı"Tanımlayıcı". Satış tablosunda aynı müşteri veya ürün tekrar tekrar görünebileceğinden, şeklin sağ tarafındaki her iki tablonun da ebeveyn, soldaki tablonun ise çocuk olduğu ortaya çıkar. Çünkü şu anda ders çalışıyoruz InterBase-SQL veritabanı sunucusu, sonraki derslerde bu tanımlara göre hareket edeceğiz. Bu kafa karışıklığı üzerinde daha fazla kafa yormamak için hemen anlaşalım: çocuk masası başka bir tabloya yabancı anahtar (YABANCI ANAHTAR) sahiptir.

    BİRİNCİL ANAHTAR

    BİRİNCİL ANAHTAR- Birincil anahtar, bir veritabanındaki ana kısıtlama türlerinden biridir. Birincil anahtar, bir tablodaki kaydı benzersiz şekilde tanımlamak için tasarlanmıştır ve benzersiz olmalıdır. Birincil anahtarlar PRIMARY KEY, genellikle ebeveyn (Ebeveyn) olarak adlandırılan tablolarda bulunur. Birincil anahtar, yerel veritabanlarının birincil dizinleriyle karıştırılmamalıdır; birincil anahtar bir dizin değil, bir kısıtlamadır. Birincil anahtar oluştururken InterBase onun için otomatik olarak oluşturur benzersiz dizin. Ancak eğer yaratırsak benzersiz dizin, bu yaratılmayacak birincil anahtar kısıtlamaları. Bir tablonun yalnızca bir birincil anahtarı olabilir: PRIMARY KEY.

    Diyelim ki çalışanların listesini içeren bir masanız var. Soyadı alanı yinelenen değerler (isimler) içerebilir, bu nedenle birincil anahtar olarak kullanılamaz. Nadirdir, ancak aynı isimlere sahip olan adaşlar da vardır. Daha da nadir olarak, tam ad benzerleri vardır, bu nedenle “Soyadı” + “Ad” + “Patronimik” alanlarının üçü de kaydın benzersizliğini garanti edemez ve birincil anahtar olamaz. Bu durumda çözüm, daha önce olduğu gibi, bu kişinin seri numarasını içeren bir tanımlayıcı alan eklemektir. Bu tür alanlar genellikle otomatik artan hale getirilir (sonraki derslerde otomatik artan alanların düzenlenmesinden bahsedeceğiz). Bu yüzden,

    Birincil anahtar kombinasyonu her kayıt için benzersiz olan bir tablodaki bir veya daha fazla alandır.

    Birincil anahtar tek bir sütun içeriyorsa (çoğunlukla olduğu gibi), PRIMARY KEY belirtici şu durumlarda kullanılır: sütun tanımı:

    CREATE TABLE Prim_1(Stolbec1 INT NULL DEĞİL BİRİNCİL ANAHTAR, Stolbec2 VARCHAR(50))

    Birincil anahtar birkaç sütun üzerine kuruluysa, belirtici tüm alanları tanımladıktan sonra yerleştirilir:

    CREATE TABLE Prim_2(Stolbec1 INT NULL DEĞİL, Stolbec2 VARCHAR(50) NOT NULL, PRIMARY KEY (Stolbec1, Stolbec2))

    Örneklerden de görülebileceği gibi birincil anahtar NOT NULL sütun(lar) kısıtlamasına sahip olmalıdır.

    EŞSİZ

    EŞSİZ- Benzersiz anahtarı. UNIQUE belirticisi bu alanın tüm değerlerinin benzersiz olması gerektiğini belirtir; dolayısıyla bu tür alanlar da değer içeremez HÜKÜMSÜZ. BENZERSİZ anahtarın birincil anahtara alternatif olduğunu söyleyebilirsiniz, ancak farklılıklar vardır. Temel fark, yalnızca bir birincil anahtarın olması gerekirken birden fazla benzersiz anahtarın olabilmesidir. Ek olarak, bir UNIQUE kısıtlaması, PRIMARY KEY veya başka bir UNIQUE kısıtlaması için kullanılan aynı sütun kümesi üzerine oluşturulamaz. Benzersiz anahtarlar, birincil anahtarlar gibi, diğer tabloların üst öğeleri olan tablolarda bulunur.

    Birincil anahtar gibi UNIQUE kısıtlamasıyla bildirilen bir sütun, üst öğesi ile ana öğesi arasında referans bütünlüğünü sağlamak için kullanılabilir. çocuk masaları. Bu durumda yabancı anahtar çocuk masası bu alan(lar)a atıfta bulunacaktır. Birincil anahtarda olduğu gibi, benzersiz bir anahtar oluşturulduğunda benzersiz dizin. Ama tam tersi değil. Bir birincil ve iki benzersiz anahtara sahip bir tablo oluşturma örneği:

    CREATE TABLE Prim_3(Stolbec1 INT NOT NULL PRIMARY KEY, Stolbec2 VARCHAR(50) NOT NULL UNIQUE, Stolbec3 FLOAT NOT NULL UNIQUE)

    YABANCI ANAHTAR

    YABANCI ANAHTAR- harici anahtar . Bu, tablolar arasında referans bütünlüğünü sağlamak için çok güçlü bir araçtır; bu, yalnızca doğru bağlantıların varlığını izlemenize değil aynı zamanda bunları otomatik olarak yönetmenize de olanak tanır. Yabancı anahtarlar, diğer tabloların çocukları (Çocuk) olan tablolarda bulunur. Bilgi tutarlılığı tam olarak birincil veya anahtara atıfta bulunan bir yabancı anahtar tarafından sağlanır.

    Son güncelleme: 07/09/2017

    Tablolar arasında ilişki kurmak için yabancı anahtarlar kullanılır. Bağımlı, alt tablodaki sütunlara bir yabancı anahtar ayarlanır ve ana tablodaki sütunlardan birine işaret eder. Yabancı anahtarın ilgili ana tablodaki birincil anahtara işaret etmesi yaygın olmasına rağmen bunun bir önkoşul olması gerekmez. Yabancı anahtar, benzersiz bir değere sahip başka bir sütuna da işaret edebilir.

    Sütun düzeyinde yabancı anahtar ayarlamak için genel sözdizimi şöyledir:

    REFERANSLAR ana_tablo (ana_tablo_sütun)

    Sütun düzeyinde yabancı anahtar kısıtlaması oluşturmak için REFERENCES anahtar sözcüğünün ardından ilgili tablonun adı ve parantez içinde yabancı anahtarın işaret edeceği ilgili sütunun adı gelir. YABANCI ANAHTAR anahtar sözcükler de genellikle eklenir, ancak prensipte gerekli değildir. REFERENCES ifadesinden sonra ON DELETE ve ON UPDATE ifadesi gelir.

    Tablo düzeyinde yabancı anahtar ayarlamanın genel sözdizimi şöyledir:

    YABANCI ANAHTAR (sütun1, sütun2, ... sütunN) REFERANSLAR ana_tablo (ana_tablo_sütun1, ana_tablo_sütun2, ... ana_tablo_sütunN)

    Örneğin, iki tablo tanımlayalım ve bunları yabancı anahtar kullanarak bağlayalım:

    CREATE TABLE Müşteriler (Id INT PRIMARY KEY IDENTITY, Age INT DEFAULT 18, FirstName NVARCHAR(20) NOT NULL, LastName NVARCHAR(20) NOT NULL, Email VARCHAR(30) UNIQUE, Phone VARCHAR(20) UNIQUE); CREATE TABLO Siparişleri (Id INT BİRİNCİL ANAHTAR KİMLİK, CustomerId INT REFERENCES Müşteriler (Id), CreatedAt Date);

    Müşteriler ve Siparişler tabloları burada tanımlanır. Müşteriler asıl müşteridir ve müşteriyi temsil eder. Siparişler bağımlıdır ve müşteri tarafından verilen siparişi temsil eder. Bu tablo, Müşteri Kimliği sütunu aracılığıyla Müşteriler tablosuna ve onun Kimlik sütununa bağlanır. Yani MüşteriKimliği sütunu, Müşteriler tablosundaki Kimlik sütununa işaret eden yabancı bir anahtardır.

    Tablo düzeyinde bir yabancı anahtarın tanımlanması şu şekilde görünecektir:

    CREATE TABLO Siparişleri (Id INT BİRİNCİL ANAHTAR KİMLİK, MüşteriId INT, CreatedAt Date, YABANCI ANAHTAR (MüşteriKimliği) REFERANSLAR Müşteriler (Id));

    Yabancı anahtar kısıtlamasına bir ad belirtmek için CONSTRAINT operatörünü kullanabilirsiniz. Genellikle bu ad "FK_" önekiyle başlar:

    CREATE TABLO Siparişleri (Id INT PRIMARY KEY IDENTITY, CustomerId INT, CreatedAt Date, CONSTRAINT FK_Orders_To_Customers YABANCI ANAHTAR (CustomerId) REFERANSLAR Müşteriler (Id));

    Bu durumda, CustomerId yabancı anahtar kısıtlamasına "FK_Orders_To_Customers" adı verilir.

    SİLMEDE ve GÜNCELLEMEDE

    ON DELETE ve ON UPDATE deyimlerini kullanarak ilgili satırın sırasıyla silinmesi veya değiştirilmesi durumunda gerçekleştirilecek eylemleri ana tablodan ayarlayabilirsiniz. Eylemi tanımlamak için aşağıdaki seçenekleri kullanabiliriz:

      CASCADE: Ana tablodaki ilgili satırlar silindiğinde veya değiştirildiğinde bağımlı tablodaki satırları otomatik olarak siler veya değiştirir.

      EYLEM YOK: Ana tablodaki ilgili satırlar silindiğinde veya değiştirildiğinde bağımlı tablo üzerinde herhangi bir işlem yapılmasını engeller. Yani aslında hiçbir eylem yok.

      SET NULL: Ana tablodan ilgili satırı silerken yabancı anahtar sütununu NULL olarak ayarlar.

      SET DEFAULT: Ana tablodan ilgili satırı silerken, yabancı anahtar sütununu DEFAULT özelliği kullanılarak belirtilen varsayılan değere ayarlar. Bir sütunun varsayılan değeri yoksa, varsayılan değer olarak NULL kullanılır.

    Basamaklı silme

    Varsayılan olarak, ana tablodaki bir satıra bağımlı tablodaki herhangi bir satır yabancı anahtarla başvuruyorsa bu satırı ana tablodan silemeyiz. Öncelikle bağımlı tablodan ilgili tüm satırları silmemiz gerekecek. Ve eğer ana tablodan bir satırı silerken, bağımlı tablodaki tüm ilgili satırların silinmesi gerekiyorsa, basamaklı silme, yani CASCADE seçeneği kullanılır:

    TABLO Siparişleri OLUŞTUR (Id INT BİRİNCİL ANAHTAR KİMLİK, MüşteriId INT, CreatedAt Date, YABANCI ANAHTAR (CustomerId) REFERANSLAR Müşteriler (Id) KADEMELİ SİLMEDE)

    ON UPDATE CASCADE ifadesi de benzer şekilde çalışır. Birincil anahtarın değerini değiştirdiğinizde, ilişkili yabancı anahtarın değeri de otomatik olarak değişir. Ancak birincil anahtarlar kural olarak çok nadiren değiştiğinden ve prensip olarak değişken değerlere sahip sütunların birincil anahtarlar olarak kullanılması önerilmediğinden, pratikte ON UPDATE ifadesi nadiren kullanılır.

    NULL ayarı

    Bir yabancı anahtar için SET NULL seçeneğini ayarladığınızda, yabancı anahtar sütununun NULL'a izin vermesi gerekir:

    TABLO OLUŞTURMA Siparişleri (Id INT BİRİNCİL ANAHTAR KİMLİK, MüşteriId INT, CreatedAt Date, YABANCI ANAHTAR (MüşteriKimliği) REFERANSLAR Müşteriler (Id) ON DELETE SET NULL);

    Varsayılan değeri ayarlama

    TABLO OLUŞTURMA Siparişleri (Id INT BİRİNCİL ANAHTAR KİMLİK, MüşteriId INT, CreatedAt Date, YABANCI ANAHTAR (MüşteriKimliği) REFERANSLAR Müşteriler (Id) SİLMEDE VARSAYILANI AYARLA)

    YABANCI ANAHTAR Bağlantı kısıtlamaları için kullanılır.
    Bir tablo alanındaki tüm değerler başka bir tablodaki bir alanda temsil edildiğinde, ilk alanın ikinciye referans verdiği söylenir. Bu, iki alanın değerleri arasında doğrudan bir ilişki olduğunu gösterir.

    Bir tablodaki bir cinsiyet diğerine atıfta bulunduğunda buna denir. yabancı anahtar; ve onun atıfta bulunduğu alana denir ebeveyn anahtarı. Yabancı anahtarın ve ana anahtarın adlarının aynı olması gerekmez. Bir yabancı anahtar, tümü tek bir birim olarak işlenen herhangi bir sayıda alana sahip olabilir. Yabancı anahtar ve onun başvurduğu ana anahtar, aynı alan numarasına ve alan türüne sahip olmalı ve aynı sırada olmalıdır. Bir alan yabancı anahtar olduğunda, bir şekilde başvuruda bulunduğu tabloyla ilişkilidir. Bir yabancı anahtarın her değeri (her satır), açık bir şekilde üst anahtarın yalnızca bir değerine (satırına) atıfta bulunmalıdır. Bu koşul karşılanırsa veritabanı şu durumda demektir: bilgi tutarlılığı.

    SQL kısıtlamayla referans bütünlüğünü korur YABANCI ANAHTAR. Bu işlevin, yabancı anahtarı ve ana anahtarı referans bütünlüğüne uymaya zorlamak için veritabanına girilebilecek değerleri sınırlaması gerekir. Kısıtlama eylemlerinden biri YABANCI ANAHTAR henüz ana anahtarda temsil edilmeyen yabancı anahtar olarak kısıtlanan alanlar için değerlerin düşürülmesidir. Bu kısıtlama aynı zamanda üst anahtar değerlerini değiştirme veya silme yeteneğini de etkiler

    Sınırlama YABANCI ANAHTAR Yabancı anahtar olarak bildirilen bir alanı içeren CREATE TABLE (veya ALTER TABLE (tablo yapısını değiştirmeye yönelik) komutunda) kullanılır. Ana anahtara, kısıtlama içinde başvurulan bir ad verilir. YABANCI ANAHTAR.

    Çoğu kısıtlama gibi, birden fazla alanın tek bir yabancı anahtar olarak kullanılmasına izin veren tablo biçiminde bir tablo veya sütun kısıtlaması olabilir.

    Tablo Kısıtlaması Söz Dizimi YABANCI ANAHTAR:

    YABANCI ANAHTAR REFERANSLAR

    [ ]

    İlk sütun listesi, bu komut tarafından oluşturulacak veya değiştirilecek bir veya daha fazla tablo sütununun virgülle ayrılmış listesidir.

    Pktable- bu ana anahtarı içeren tablodur. Geçerli komut tarafından oluşturulan veya değiştirilen bir tablo olabilir.

    İkinci sütun listesi ana anahtarı oluşturacak sütunların listesidir. İki sütun listesinin uyumlu olması gerekir, yani:

    • aynı sayıda sütuna sahip
    • belirli bir sırada, yabancı anahtar sütun listesinin birinci, ikinci, üçüncü vb. sütunları, ana anahtar sütun listesinin birinci, ikinci, üçüncü vb. sütunlarıyla aynı veri türlerine ve boyutlarına sahip olmalıdır.
    • her iki sütunun listesindeki sütunlar aynı adlara sahip olmamalıdır.

    YABANCI ANAHTAR Örnek 1

    TABLO OLUŞTUR Öğrenci
    (Kod_stud tamsayı BOŞ BİRİNCİL DEĞİL ANAHTAR,
    Kod_spec tamsayı BOŞ DEĞİL,

    Adresler char(50),
    Top ondalık),
    YABANCI ANAHTAR(Kod_spec) REFERANSLAR Spesifikasyon (Kod_spec)
    );

    Kısıtlamayı uygulamak için CREATE TABLE yerine ALTER TABLE kullanıldığında YABANCI ANAHTAR yabancı anahtar ve ana anahtarda belirtilen değerlerin referans bütünlüğü durumunda olması gerekir. Aksi takdirde komut reddedilecektir.

    Kısıtlamayı kullanma YABANCI ANAHTAR tablo veya sütunda, ana anahtarın PRIMARY kısıtlaması varsa ana anahtar sütun listesini atlayabilirsiniz ANAHTAR. Doğal olarak, birçok alana sahip anahtarlar söz konusu olduğunda, yabancı ve birincil anahtarlardaki sütunların sırası eşleşmelidir ve her durumda, iki anahtar arasındaki uyumluluk ilkesi hâlâ geçerlidir.

    YABANCI ANAHTAR Örnek 2

    TABLO OLUŞTUR Öğrenci (
    Kod_stud tamsayı BOŞ BİRİNCİL DEĞİL ANAHTAR,
    Fam char(30) BOŞ EŞSİZ DEĞİL,
    Adresler char(50),
    Top ondalık),
    Kod_spec tamsayı REFERANSLAR Özellik
    );

    Referans bütünlüğünü korumak, yabancı anahtar ve ana anahtar olarak bildirilen alanlarda temsil edilebilecek değerler üzerinde bazı kısıtlamalar gerektirir. Ana anahtar, her yabancı anahtar değerinin belirli bir satıra karşılık gelmesini sağlayacak şekilde yapılandırılmalıdır. Bu, (anahtarın) benzersiz olması ve herhangi bir boş değer (NULL) içermemesi gerektiği anlamına gelir.

    Bu, ana anahtarın yabancı anahtar bildirirken olduğu gibi aynı gereksinimi karşılaması için yeterli değildir. SQL ana anahtara çift değerlerin veya boş değerlerin getirilmediğinden emin olmalısınız. Bu nedenle, üst anahtar olarak kullanılan tüm alanların PRIMARY kısıtlamasına sahip olduğundan emin olmalısınız. ANAHTAR veya NOT NULL kısıtlaması gibi UNIQUE kısıtlaması.

    Yabancı anahtarlara yalnızca birincil anahtarlara atıfta bulunmak iyi bir stratejidir. Yabancı anahtarlar kullanıldığında, bunlar yalnızca başvurdukları ana anahtarlarla ilişkilendirilmez; ana anahtarın bulunacağı belirli bir tablo satırıyla ilişkilendirilirler. Ana anahtarın kendisi, yabancı anahtarda mevcut olmayan herhangi bir bilgiyi sağlamaz.

    Birincil anahtarın amacı bir satırın benzersizliğini belirlemek olduğundan, yabancı anahtar için daha mantıklı ve daha az belirsiz bir seçimdir. Ana anahtarı olarak benzersiz bir anahtar kullanan herhangi bir yabancı anahtar için, aynı etki için aynı tablonun birincil anahtarını kullanan bir yabancı anahtar oluşturmanız gerekir. Satırları birbirine bağlamaktan başka bir amacı olmayan yabancı anahtar, yalnızca satırları tanımlamak için kullanılan birincil anahtara benzer ve veritabanı yapısını açık ve basit tutmanın iyi bir yoludur. Yabancı anahtar yalnızca ana anahtarda gerçekten mevcut olan veya boş (NULL) değerleri içerebilir. Bu anahtara başka değerler girme girişimleri reddedilecektir.

    YABANCI ANAHTAR Örnek 3

    TABLO OLUŞTUR ödeme (
    sh_payout tamsayı,
    sh_eml tamsayı,
    tarih_ödeme tarihi,
    toplam_ödeme gerçek,
    YABANCI ANAHTAR(sh_eml) REFERANSLAR k_sotr2 (eid)
    );

    Bu örnekte YABANCI ANAHTAR sh_eml sütunu, k_sotr2 tablosundaki eid sütunuyla ilişkilendirilir.