Yabancı anahtar - Foreign key

Basitçe bir yabancı anahtar bir tablodaki başka bir tablonun birincil anahtarına başvuran bir öznitelik kümesidir. Yabancı anahtar bu iki tabloyu birbirine bağlar. Başka bir şekilde ifade etmek gerekirse: ilişkisel veritabanları, bir yabancı anahtar belirli bir tür dahil etme bağımlılığı kısıtlamalarına tabi bir öznitelikler kümesidir, özellikle de demetler yabancı anahtardan oluşan Öznitellikler birinde ilişki, R, aynı zamanda başka (ayrı olması gerekmeyen) bir ilişkide de mevcut olmalıdır, S ve dahası bu nitelikler de bir aday anahtar S.'de[1][2][3] Daha basit bir deyişle, yabancı anahtar, Referanslar bir aday anahtar. Örneğin, TEAM adlı bir tablo, PERSON tablosunda PERSON_NAME adlı bir aday anahtara başvuran yabancı anahtar olan MEMBER_NAME özelliğine sahip olabilir. MEMBER_NAME yabancı bir anahtar olduğundan, TEAM'deki bir üyenin adı olarak var olan herhangi bir değer, PERSON tablosunda da bir kişinin adı olarak bulunmalıdır; diğer bir deyişle, bir TAKIMIN her üyesi aynı zamanda bir KİŞİ'dir.

Özet

Yabancı anahtarı içeren tabloya alt tablo adı verilir ve aday anahtarı içeren tabloya başvurulan veya üst tablo adı verilir.[4] Veritabanı ilişkisel modelleme ve uygulamada, bir aday anahtar, bir ilişkideki her bir demet (satır) için değerlerinin benzersiz olması garanti edilen sıfır veya daha fazla öznitelik kümesidir. Herhangi bir demet için aday anahtar özniteliklerinin değeri veya değerlerinin birleşimi, bu ilişkideki başka herhangi bir tuple için kopyalanamaz.

Yabancı anahtarın amacı, başvurulan tablonun belirli bir satırını tanımlamak olduğu için, genellikle yabancı anahtarın birincil tablonun bir satırındaki aday anahtara eşit olması veya başka bir değere sahip olmaması gerekir ( BOŞ değer.[2]). Bu kurala bilgi tutarlılığı kısıtlaması iki masa arasında.[5]Bu kısıtlamaların ihlal edilmesi birçok veritabanı sorununun kaynağı olabileceğinden, çoğu Veritabanı Yönetim Sistemleri her boş olmayan yabancı anahtarın başvurulan tablonun bir satırına karşılık gelmesini sağlayacak mekanizmalar sağlayın.[6][7][8]

Örneğin, iki tablo içeren bir veritabanı düşünün: tüm müşteri verilerini içeren bir MÜŞTERİ tablosu ve tüm müşteri siparişlerini içeren bir SİPARİŞ tablosu. İşletmenin her siparişin tek bir müşteriye atıfta bulunmasını gerektirdiğini varsayalım. Bunu veritabanına yansıtmak için, SİPARİŞ tablosuna (örneğin, MÜŞTERİ KİMLİĞİ) bir yabancı anahtar sütunu eklenir ve birincil anahtar MÜŞTERİ (ör. ID). Bir tablonun birincil anahtarının benzersiz olması gerektiğinden ve CUSTOMERID yalnızca bu birincil anahtar alanındaki değerleri içerdiğinden, bir değere sahip olduğunda, CUSTOMERID'in siparişi veren belirli müşteriyi tanımlayacağını varsayabiliriz. Ancak, SİPARİŞ tablosu, MÜŞTERİ tablosunun satırları silindiğinde veya kimlik sütunu değiştirildiğinde güncel tutulmadığında artık bu varsayılamaz ve bu tablolarla çalışmak daha zor hale gelebilir. Birçok gerçek dünya veritabanı, ana tablo yabancı anahtarlarını fiziksel olarak silmek yerine "devre dışı bırakarak" veya bir değişiklik gerektiğinde bir yabancı anahtara yapılan tüm başvuruları değiştiren karmaşık güncelleme programlarıyla bu soruna geçici bir çözüm sunar.

Yabancı anahtarlar önemli bir rol oynar: veri tabanı tasarımı. Veritabanı tasarımının önemli bir parçası, gerçek dünyadaki varlıklar arasındaki ilişkilerin, bir tablodan diğerine başvurmak için yabancı anahtarlar kullanılarak referanslarla veritabanına yansıtıldığından emin olmaktır.[9]Veritabanı tasarımının bir diğer önemli kısmı veritabanı normalleştirme, tabloların parçalandığı ve yabancı anahtarların yeniden yapılandırılmalarını mümkün kıldığı.[10]

Başvuran (veya alt) tablodaki birden çok satır, başvurulan (veya üst) tablodaki aynı satıra başvurabilir. Bu durumda, iki tablo arasındaki ilişkiye a bire çok ilişki referans tablo ile referans tablosu arasında.

Ek olarak, alt ve üst tablo aslında aynı tablo olabilir, yani yabancı anahtar aynı tabloya geri dönebilir. Böyle bir yabancı anahtar SQL: 2003 kendine referans veren veya özyinelemeli yabancı anahtar olarak. Veritabanı yönetim sistemlerinde, bu genellikle birinci ve ikinci referansın aynı tabloya bağlanmasıyla gerçekleştirilir.

Bir tablonun birden çok yabancı anahtarı olabilir ve her yabancı anahtarın farklı bir üst tablosu olabilir. Her yabancı anahtar, bağımsız olarak veritabanı sistemi. Bu nedenle, tablolar arasında basamaklı ilişkiler yabancı anahtarlar kullanılarak kurulabilir.

Yabancı anahtar, değeri başka bir ilişkideki birincil anahtarla eşleşen bir ilişkideki bir öznitelik veya öznitelik kümesi olarak tanımlanır. kısıtlama. Mevcut bir tabloya böyle bir kısıtlama eklemek için sözdizimi, SQL: 2003 Aşağıda gösterildiği gibi. REFERENCES yan tümcesinde sütun listesinin çıkarılması, yabancı anahtarın başvurulan tablonun birincil anahtarına başvurması gerektiği anlamına gelir.Aynı şekilde, yabancı anahtarlar bir parçası olarak tanımlanabilir. TABLO OLUŞTUR SQL ifadesi.

OLUŞTURMAK TABLO Tablo ismi (   İD    TAM  BİRİNCİL ANAHTAR,   col2  KARAKTER DEĞİŞEN(20),   col3  TAM,   ...   DIŞ ANAHTAR(col3)      REFERANSLAR other_table(key_col) AÇIK SİL ÇAĞLAYAN,   ... )

Yabancı anahtar yalnızca tek bir sütuysa, sütun aşağıdaki sözdizimi kullanılarak bu şekilde işaretlenebilir:

DEĞİŞTİR TABLO <masa tanımlayıcı>   EKLE [ KISITLAMA <kısıtlama tanımlayıcı> ]      DIŞ ANAHTAR ( <sütun ifade> {, <sütun ifade>}... )      REFERANSLAR <masa tanımlayıcı> [ ( <sütun ifade> {, <sütun ifade>}... ) ]      [ AÇIK GÜNCELLEME <referans aksiyon> ]      [ AÇIK SİL <referans aksiyon> ]

Yabancı anahtarlar bir ile tanımlanabilir saklı yordam Beyan.[daha fazla açıklama gerekli ]

sp_foreignkey tabname, pktabname, col1 [, col2] ...  [, col8]
OLUŞTURMAK TABLO Tablo ismi (   İD    TAM  BİRİNCİL ANAHTAR,   col2  KARAKTER DEĞİŞEN(20),   col3  TAM REFERANSLAR other_table(sütun adı),   ... )
  • tabname: Tanımlanacak yabancı anahtarı içeren tablo veya görünümün adı.
  • pktabname: yabancı anahtarın geçerli olduğu birincil anahtara sahip tablo veya görünümün adı. Birincil anahtar önceden tanımlanmış olmalıdır.
  • col1: yabancı anahtarı oluşturan ilk sütunun adı. Yabancı anahtarın en az bir sütunu olmalı ve en çok sekiz sütunu olabilir.

Referans eylemler

Çünkü veritabanı Yönetim sistemi referans kısıtlamaları uygular, başvurulan tablodaki satırlar silinecek (veya güncellenecek) ise veri bütünlüğünü sağlamalıdır. Referans tablolarındaki bağımlı satırlar hala mevcutsa, bu referansların dikkate alınması gerekir. SQL: 2003 5 farklı belirtir referans eylemler bu tür olaylarda meydana gelecek:

ÇAĞLAYAN

Üst (başvurulan) tablodaki satırlar silindiğinde (veya güncellendiğinde), eşleşen yabancı anahtar sütununa sahip alt tablonun (başvuran) ilgili satırları da silinir (veya güncellenir). Buna kademeli silme (veya güncelleme) denir.

KISITLAMA

Başvurulan tablodaki değere başvuran bir referans veya alt tabloda bir satır olduğunda değer güncellenemez veya silinemez.

Benzer şekilde, bir referans veya alt tablodan kendisine referans olduğu sürece bir satır silinemez.

RESTRICT'i (ve CASCADE) daha iyi anlamak için, hemen anlaşılamayabilecek aşağıdaki farkı fark etmek faydalı olabilir. Referans eylemi CASCADE, CASCADE kelimesinin kullanıldığı (alt) tablonun kendisinin "davranışını" değiştirir. Örneğin, ON DELETE CASCADE etkin bir şekilde "Başvurulan satır diğer tablodan (ana tablo) silindiğinde, ardından sil ayrıca benden". Bununla birlikte, RESTRICT bilgi eylemi ana tablonun" davranışını "değiştirir, değil alt tablo, her ne kadar RESTRICT sözcüğü ana tabloda değil alt tabloda görünse de! Dolayısıyla, ON DELETE RESTRICT etkili bir şekilde şunu söyler: "Birisi diğer tablodan (ana tablo) satırı silmeye çalıştığında, silmeyi önleyin diğer masadan (ve tabii ki benden de silmeyin, ama buradaki ana nokta bu değil). "

RESTRICT, Microsoft SQL 2012 ve öncesi tarafından desteklenmez.

HİÇBİR EYLEM

HİÇBİR EYLEM ve KISITLAMA birbirine çok benzer. EYLEM YOK ve KISITLAMA arasındaki temel fark, EYLEM YOK ile, tabloyu değiştirmeye çalıştıktan sonra bilgi tutarlılığı kontrolünün yapılmasıdır. RESTRICT, kontrolü gerçekleştirmeye çalışmadan önce GÜNCELLEME veya SİL Beyan. Bilgi tutarlılık denetimi başarısız olursa her iki bilgi eylemi de aynı şekilde davranır: UPDATE veya DELETE ifadesi bir hataya neden olur.

Başka bir deyişle, bir UPDATE veya DELETE ifadesi, referans eylemi NO ACTION kullanılarak referans tablo üzerinde yürütüldüğünde, DBMS, ifade yürütme işleminin sonunda hiçbir referans ilişkisinin ihlal edilmediğini doğrular. Bu, başlangıçta işlemin kısıtlamayı ihlal edeceğini varsayan RESTRICT'ten farklıdır. EYLEM YOK seçeneğinin kullanılması, tetikler ya da ifadenin anlamsallığı, kısıtlamanın son olarak kontrol edildiği anda hiçbir yabancı anahtar ilişkisinin ihlal edilmediği bir son durum verebilir, böylece ifadenin başarılı bir şekilde tamamlanmasına izin verebilir.

VARSAYILAN AYARLA, BOŞ AYARLA

Genel olarak, tarafından gerçekleştirilen eylem DBMS SET NULL veya SET DEFAULT için hem ON DELETE hem de ON UPDATE için aynıdır: Etkilenen başvuru özniteliklerinin değeri SET NULL için NULL olarak ve SET DEFAULT için belirtilen varsayılan değere değiştirilir.

Tetikleyiciler

Referans eylemler genellikle ima edildiği gibi uygulanır tetikler (yani, sistem tarafından oluşturulan adlara sahip tetikleyiciler, genellikle gizlidir.) Bu nedenle, kullanıcı tanımlı tetikleyicilerle aynı sınırlamalara tabidirler ve diğer tetikleyicilere göre yürütme sıralarının dikkate alınması gerekebilir; bazı durumlarda, uygun yürütme sırasını sağlamak için referans eylemi eşdeğer kullanıcı tanımlı tetikleyici ile değiştirmek veya değişim tablosu sınırlamalarını aşmak için gerekli olabilir.

Bir başka önemli sınırlama, işlem izolasyonu: Bir satırda yaptığınız değişiklikler, satıra işleminizin "göremediği" veriler tarafından başvurulduğundan ve bu nedenle üzerine basamaklandırılamayacağından tam olarak basamaklanamayabilir. Bir örnek: işleminiz bir müşteri hesabını yeniden numaralandırmaya çalışırken, eşzamanlı bir işlem aynı müşteri için yeni bir fatura oluşturmaya çalışır; Bir CASCADE kuralı, işleminizin görebileceği tüm fatura satırlarını yeniden numaralandırılmış müşteri satırıyla tutarlı tutmak için düzeltebilirken, oradaki verileri düzeltmek için başka bir işleme ulaşmaz; Veritabanı, iki işlem gerçekleştirildiğinde tutarlı verileri garanti edemediği için, bunlardan biri geri dönmeye zorlanacaktır (genellikle ilk gelen ilk hizmet esasına göre).

OLUŞTURMAK TABLO hesap (acct_num INT, Miktar ONDALIK(10,2));OLUŞTURMAK TETİKLEME ins_sum ÖNCE INSERT AÇIK hesap     İÇİN HER BİRİ KÜREK ÇEKMEK AYARLAMAK @toplam = @toplam + YENİ.Miktar;

Misal

Yabancı anahtarları gösteren ilk örnek olarak, bir hesap veritabanının faturaların olduğu bir tabloya sahip olduğunu ve her faturanın belirli bir tedarikçiyle ilişkilendirildiğini varsayalım. Tedarikçi ayrıntıları (ad ve adres gibi) ayrı bir tabloda tutulur; her tedarikçiye onu tanımlaması için bir 'tedarikçi numarası' verilir. Her fatura kaydının, o faturanın tedarikçi numarasını içeren bir özelliği vardır. Ardından, 'tedarikçi numarası' Tedarikçi tablosundaki birincil anahtardır. Faturalar tablosundaki yabancı anahtar bu birincil anahtara işaret ediyor. İlişkisel şema aşağıdaki gibidir. Birincil anahtarlar kalın, yabancı anahtarlar ise italik olarak işaretlenmiştir.

  Tedarikçi ( Tedarikçi Numarası, İsim, Adres, Tür) Faturalar ( Fatura numarası, Tedarikçi Numarası, Metin )

Karşılık gelen Veri Tanımlama Dili ifadesi aşağıdaki gibidir.

  OLUŞTURMAK TABLO Tedarikçi (     Tedarikçi Numarası  TAM DEĞİL BOŞ,     İsim            VARCHAR(20) DEĞİL BOŞ,     Adres         VARCHAR(50) DEĞİL BOŞ,     Tür            VARCHAR(10),     KISITLAMA Supplier_pk BİRİNCİL ANAHTAR(Tedarikçi Numarası),     KISITLAMA sayı_değer KONTROL (Tedarikçi Numarası > 0) )  OLUŞTURMAK TABLO Faturalar (     Fatura numarası   TAM DEĞİL BOŞ,     Tedarikçi Numarası  TAM DEĞİL BOŞ,     Metin            VARCHAR(4096),     KISITLAMA invoice_pk BİRİNCİL ANAHTAR(Fatura numarası),     KISITLAMA inumber_value KONTROL (Fatura numarası > 0),     KISITLAMA tedarikçi_fk DIŞ ANAHTAR(Tedarikçi Numarası)        REFERANSLAR Tedarikçi(Tedarikçi Numarası)        AÇIK GÜNCELLEME ÇAĞLAYAN AÇIK SİL KISITLAMA )

Ayrıca bakınız

Referanslar

  1. ^ Coronel Carlos (2010). Veritabanı Sistemleri: Tasarım, Uygulama ve Yönetim. Bağımsızlık KY: Güney-Batı / Cengage Öğrenimi. s. 65. ISBN  978-0-538-74884-1.
  2. ^ a b Elmasri, Ramez (2011). Veritabanı Sistemlerinin Temelleri. Addison-Wesley. pp.73 –74. ISBN  978-0-13-608620-8.
  3. ^ Tarih, C.J. (1996). SQL standardı kılavuzu. Addison-Wesley. s. 206. ISBN  978-0201964264.
  4. ^ Sheldon, Robert (2005). MySQL Başlangıcı. John Wiley & Sons. s. 119–122. ISBN  0-7645-7950-9.
  5. ^ "Veritabanı Temelleri - Yabancı Anahtarlar". Alındı 2010-03-13.
  6. ^ MySQL AB (2006). MySQL Yönetici Kılavuzu ve Dil Başvurusu. Sams Yayıncılık. s. 40. ISBN  0-672-32870-4.
  7. ^ Powell, Gavin (2004). Oracle SQL: Örneklerle Hızlı Başlangıç. Elsevier. s.11. DE OLDUĞU GİBİ  B008IU3AHY.
  8. ^ Mullins Craig (2012). DB2 geliştirici kılavuzu. IBM Press. DE OLDUĞU GİBİ  B007Y6K9TK.
  9. ^ Sheldon, Robert (2005). MySQL Başlangıcı. John Wiley & Sons. s. 156. ISBN  0-7645-7950-9.
  10. ^ Garcia-Molina, Hector (2009). Veritabanı Sistemleri: Tam Kitap. Prentice Hall. pp.93 –95. ISBN  978-0-13-187325-4.

Dış bağlantılar