İngilizce dilinde oku

Aracılığıyla paylaş


Birincil ve yabancı anahtar kısıtlamaları

Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri Microsoft Fabric'te Azure SQL VeritabanıAzure SQL Yönetilen ÖrneğiSQL veritabanı

Birincil anahtarlar ve yabancı anahtarlar, SQL Server tablolarında veri bütünlüğünü zorlamak için kullanılabilecek iki tür kısıtlamadır. Bunlar önemli veritabanı nesneleridir.

Birincil anahtar kısıtlamaları

Tablo genellikle tablodaki her satırı benzersiz olarak tanımlayan değerler içeren bir sütuna veya sütun bileşimine sahiptir. Bu sütun veya sütunlar, tablonun birincil anahtarı (PK) olarak adlandırılır ve tablonun varlık bütünlüğünü zorlar. Birincil anahtar kısıtlamaları benzersiz verileri garanti ettiğinden, bunlar sıklıkla bir kimlik sütununda tanımlanır.

Bir tablo için birincil anahtar kısıtlaması belirttiğinizde, Veritabanı Altyapısı birincil anahtar sütunları için otomatik olarak benzersiz bir dizin oluşturarak veri benzersizliğini zorlar. Bu dizin, sorgularda birincil anahtar kullanıldığında verilere hızlı erişime de izin verir. Birincil anahtar kısıtlaması birden fazla sütunda tanımlanmışsa, değerler bir sütun içinde çoğaltılabilir, ancak birincil anahtar kısıtlama tanımındaki tüm sütunlardaki değerlerin her birleşimi benzersiz olmalıdır.

Aşağıdaki çizimde gösterildiği gibi, Purchasing.ProductVendor tablosundaki ProductID ve VendorID sütunları bu tablo için bileşik birincil anahtar kısıtlaması oluşturur. Bu, ProductVendor tablosundaki her satırın benzersiz bir ProductID ve VendorIDbirleşimine sahip olmasını sağlar. Bu, yinelenen satırların eklenmesini engeller.

Bileşik birincil anahtar kısıtlaması için tablodaki satırların diyagramı.

  • Bir tablo yalnızca bir birincil anahtar kısıtlaması içerebilir.
  • Birincil anahtar 16 sütunu ve toplam anahtar uzunluğu 900 bayt'ı aşamaz.
  • Birincil anahtar kısıtlaması tarafından oluşturulan dizin, tablodaki dizin sayısının 999 kümelenmemiş dizini ve 1 kümelenmiş dizini aşmasına neden olamaz.
  • Birincil anahtar kısıtlaması için kümelenmiş veya kümelenmemiş bir yapısı belirtilmemişse, tabloda kümelenmiş bir dizin yoksa kümelenmiş bir yapı kullanılır.
  • Birincil anahtar kısıtlaması içinde tanımlanan tüm sütunlar null değil olarak tanımlanmalıdır. Null atanabilirlik belirtilmezse, birincil anahtar kısıtlamasına katılan tüm sütunların null atanabilirlik değeri null değil olarak ayarlanır.
  • Birincil anahtar CLR kullanıcı tanımlı tür sütununda tanımlanmışsa, türün uygulanması ikili sıralamayı desteklemelidir.

Yabancı anahtar kısıtlamaları

Yabancı anahtar (FK), yabancı anahtar tablosunda depolanabilecek verileri denetlemek üzere iki tablodaki veriler arasında bağlantı kurmak ve zorlamak için kullanılan bir sütun veya sütun birleşimidir. Yabancı anahtar başvurusunda, bir tablonun birincil anahtar değerini tutan sütuna veya sütunlara başka bir tablodaki sütun veya sütunlar tarafından başvurulduğunda, iki tablo arasında bir bağlantı oluşturulur. Bu sütun ikinci tabloda yabancı anahtara dönüşür.

Örneğin, Sales.SalesOrderHeader tablosunun Sales.SalesPerson tablosuna yabancı anahtar bağlantısı vardır çünkü satış siparişleri ile satış temsilcileri arasında mantıksal bir ilişki bulunmaktadır. SalesOrderHeader tablosundaki SalesPersonID sütunu, SalesPerson tablosunun birincil anahtar sütunuyla eşleşir. SalesOrderHeader tablosundaki SalesPersonID sütunu, SalesPerson tablosunun yabancı anahtarıdır. Bu yabancı anahtar ilişkisi oluşturduğunuzda, SalesPersonID değeri SalesPerson tablosunda yoksa SalesOrderHeader tablosuna eklenemez.

Tablo, yabancı anahtarlar olarak en fazla 253 tablo ve sütunu referans alabilir. SQL Server 2016 (13.x), tek bir tablodaki (gelen başvurular) sütunlara başvurabilen diğer tablo ve sütunların sayısını 253'ten 10.000'e yükseltir. (En az 130 uyumluluk düzeyi gerektirir.) Artış aşağıdaki kısıtlamalara sahiptir:

  • Yalnızca DELETE DML işlemleri için 253'ten fazla yabancı anahtar başvurusu desteklenir. UPDATE ve MERGE işlemleri desteklenmez.

  • Kendisine yabancı anahtar başvurusu olan bir tablo yine de 253 yabancı anahtar başvurusuyla sınırlıdır.

  • Şu anda columnstore dizinleri, bellek için iyileştirilmiş tablolar, Stretch Database veya bölümlenmiş yabancı anahtar tabloları için 253'ten fazla yabancı anahtar referansı mevcut değildir.

    Önemli

    Stretch Database, SQL Server 2022 (16.x) ve Azure SQL Veritabanı'nda kullanım dışıdır. Bu özellik, Veritabanı Altyapısı'nın gelecekteki bir sürümünde kaldırılacaktır. Bu özelliği yeni geliştirme çalışmalarında kullanmaktan kaçının ve şu anda bu özelliği kullanan uygulamaları değiştirmeyi planlayın.

Yabancı anahtar kısıtlamalarına ilişkin dizinler

Birincil anahtar kısıtlamalarından farklı olarak, yabancı anahtar kısıtlaması oluşturmak otomatik olarak karşılık gelen bir dizin oluşturmaz. Ancak, yabancı anahtar üzerinde el ile dizin oluşturmak genellikle aşağıdaki nedenlerle yararlıdır:

  • Yabancı anahtar sütunları, bir tablonun yabancı anahtar kısıtlamasında yer alan sütun veya sütunları diğer tablodaki birincil veya benzersiz anahtar sütunu veya sütunlarıyla eşleştirerek ilişkili tablolardaki veriler sorgularda birleştirildiğinde birleştirme ölçütlerinde sıklıkla kullanılır. Dizin, Veritabanı Altyapısı'nın yabancı anahtar tablosundaki ilgili verileri hızla bulmasını sağlar. Ancak, bu dizini oluşturmak gerekli değildir. Tablolar arasında birincil anahtar veya yabancı anahtar kısıtlamaları tanımlanmasa bile iki ilişkili tablodaki veriler birleştirilebilir, ancak iki tablo arasındaki yabancı anahtar ilişkisi, iki tablonun ölçüt olarak anahtarları kullanan bir sorguda birleştirilecek şekilde iyileştirildiğini gösterir.

  • Birincil anahtar kısıtlamalarındaki değişiklikler, ilgili tablolardaki yabancı anahtar kısıtlamalarıyla denetleniyor.

Referans bütünlüğü

Yabancı anahtar kısıtlamasının temel amacı yabancı anahtar tablosunda depolanabilecek verileri denetlemek olsa da, birincil anahtar tablosundaki verilerde yapılan değişiklikleri de denetler. Örneğin, bir satış temsilcisinin satırı Sales.SalesPerson tablosundan silinirse ve Sales.SalesOrderHeader tablosundaki satış siparişleri için satış temsilcisinin kimliği kullanılırsa, iki tablo arasındaki ilişkisel bütünlük bozulur; Silinen satış temsilcisinin satış siparişleri, SalesPerson tablosundaki verilere bağlantı olmadan SalesOrderHeader tablosunda yalnız bırakılır.

Yabancı anahtar kısıtlaması bu durumu engeller. Kısıtlama, yabancı anahtar tablosundaki verilere bağlantıyı geçersiz kılması durumunda birincil anahtar tablosundaki verilerde değişiklik yapılamadığını garanti ederek bilgi tutarlılığını zorunlu tutar. Birincil anahtar tablosundaki satırı silmeye veya birincil anahtar değerini değiştirmeye çalışılırsa, silinen veya değiştirilen birincil anahtar değeri başka bir tablonun yabancı anahtar kısıtlamasında bir değere karşılık geldiğinde eylem başarısız olur. Yabancı anahtar kısıtlamasında bir satırı başarıyla değiştirmek veya silmek için, önce yabancı anahtar tablosundaki yabancı anahtar verilerini silmeniz veya yabancı anahtarı farklı birincil anahtar verilerine bağlayan yabancı anahtar tablosundaki yabancı anahtar verilerini değiştirmeniz gerekir.

Basamaklı bilgi tutarlılığı

Basamaklı bilgi tutarlılığı kısıtlamalarını kullanarak, kullanıcı mevcut yabancı anahtarların işaret ettiği bir anahtarı silmeye veya güncelleştirmeye çalıştığında Veritabanı Altyapısı'nın gerçekleştireceği eylemleri tanımlayabilirsiniz. Aşağıdaki basamaklı eylemler tanımlanabilir.

  • NO ACTION

    Veritabanı Motoru bir hata oluşturur ve ana tablodaki satırdaki silme veya güncelleştirme işlemi geri alınır.

  • CASCADE

    İlgili satır üst tabloda güncelleştirildiğinde veya silindiğinde başvuru tablosunda karşılık gelen satırlar güncelleştirilir veya silinir. zaman damgası sütunu yabancı anahtarın veya başvuruda bulunulan anahtarın parçasıysa CASCADE belirtilmemelidir. ON DELETE CASCADE INSTEAD OF DELETE tetikleyicisi olan bir tablo için belirtilemiyor. INSTEAD OF UPDATE tetikleyicileri olan tablolar için ON UPDATE CASCADE belirtilemiyor.

  • SET NULL

    Üst tablodaki karşılık gelen satır güncelleştirildiğinde veya silindiğinde yabancı anahtarı oluşturan tüm değerler NULL olarak ayarlanır. Bu kısıtlamanın yürütülmesi için yabancı anahtar sütunlarının null atanabilir olması gerekir. INSTEAD OF UPDATE tetikleyicileri olan tablolar için belirtilemiyor.

  • SET DEFAULT

    Üst tablodaki karşılık gelen satır güncelleştirilir veya silinirse, yabancı anahtarı oluşturan tüm değerler varsayılan değerlerine ayarlanır. Bu kısıtlamanın yürütülmesi için tüm yabancı anahtar sütunlarının varsayılan tanımları olmalıdır. Bir sütun null olabilir ve belirli bir varsayılan değer belirtilmemişse, NULL otomatik olarak sütunun varsayılan değeri olur. INSTEAD OF UPDATE tetikleyicileri olan tablolar için belirtilemiyor.

CASCADE, SET NULL, SET DEFAULTve NO ACTION, birbiriyle bilgi ilişkileri olan tablolarda birleştirilebilir. Veritabanı Altyapısı NO ACTIONile karşılaşırsa, ilgili CASCADE, SET NULLve SET DEFAULT eylemlerini durdurur ve geri alır. DELETE deyimi CASCADE, SET NULL, SET DEFAULTveya NO ACTION eylemlerinin birleşimine neden olduğunda, Veritabanı Altyapısı herhangi bir NO ACTIONkontrol etmeden önce tüm CASCADE, SET NULLve SET DEFAULT eylemleri uygulanır.

Tetikleyiciler ve basamaklı başvuru eylemleri

Basamaklı bilgi eylemleri, AFTER UPDATE veya AFTER DELETE tetikleyicilerini aşağıdaki şekilde tetikler:

  • Özgün DELETE veya UPDATE nedeniyle doğrudan tüm basamaklı başvuru eylemleri önce gerçekleştirilir.

  • Etkilenen tablolarda tanımlanmış AFTER tetikleyicileri varsa, tüm basamaklı eylemler gerçekleştirildikten sonra bu tetikleyiciler tetiklenir. Bu tetikleyiciler, basamaklı eylemlerin gerçekleşme sırasının tersine çalışır. Tek bir tabloda birden çok tetikleyici varsa, tablo için ayrılmış bir ilk veya son tetikleyici olmadığı sürece rastgele sırayla tetiklenir. Bu sipariş, sp_settriggerorderkullanılarak belirtildiği gibidir.

  • Birden çok ardışık zincir, bir UPDATE veya DELETE eyleminin doğrudan hedefi olan tablodan geliyorsa, bu zincirlerin ilgili tetikleyicilerini tetikleme sıralaması belirtilmez. Ancak bir zincir, başka bir zincir ateş etmeye başlamadan önce her zaman tüm tetikleyicilerini tetikler.

  • Bir UPDATE veya DELETE eyleminin doğrudan hedefi olan tablodaki bir AFTER tetikleyicisi, herhangi bir satırın etkilenip etkilenmediğine bakılmaksızın tetiklenir. Bu durumda basamaklamadan etkilenen başka tablo yoktur.

  • Önceki tetikleyicilerden herhangi biri diğer tablolarda UPDATE veya DELETE işlemleri gerçekleştiriyorsa, bu eylemler ikincil basamaklı zincirleri başlatabilir. Bu ikincil zincirler, tüm birincil zincirlerdeki tüm tetikleyiciler tetiklendikten sonra her UPDATE veya DELETE işlemi için bir kerede işlenir. Bu işlem sonraki UPDATE veya DELETE işlemleri için yinelemeli olarak yinelenebilir.

  • Tetikleyicilerde CREATE, ALTER, DELETEveya diğer veri tanımlama dili (DDL) işlemlerinin gerçekleştirilmesi, DDL tetikleyicilerini tetikleyebilir. Bu işlem daha sonra ek basamaklı zincirler ve tetikleyiciler başlatan DELETE veya UPDATE işlemleri gerçekleştirebilir.

  • Belirli bir basamaklı bilgi işlem zincirinde hata oluşturulursa, bir hata oluşur, bu zincirde AFTER tetikleyici tetiklenmez ve zinciri oluşturan DELETE veya UPDATE işlemi geri alınır.

  • INSTEAD OF tetikleyicisi olan bir tablo, basamaklı eylemi belirten bir REFERENCES yan tümcesine de sahip olamaz. Ancak, basamaklı eylem tarafından hedeflenen bir tablodaki AFTER tetikleyicisi, başka bir tabloda INSERT, UPDATEveya DELETE deyimi yürütebilir ya da bu nesnede tanımlanan bir INSTEAD OF tetikleyicisini tetikleyen görünümü görüntüleyebilir.