Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümler
Azure SQL Database
Azure SQL Managed Instance
SQL database in Microsoft Fabric
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, ProductID tablosundaki VendorID ve Purchasing.ProductVendor 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.
- Bir tablo yalnızca bir birincil anahtar kısıtlaması içerebilir.
- Birincil anahtar 32 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.
SalesPersonID tablosundaki SalesOrderHeader sütunu, SalesPerson tablosunun birincil anahtar sütunuyla eşleşir.
SalesPersonID tablosundaki SalesOrderHeader sütunu, SalesPerson tablosunun yabancı anahtarıdır. Bu yabancı anahtar ilişkisi oluşturduğunuzda, SalesPersonID değeri SalesOrderHeader tablosunda yoksa SalesPerson 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
DELETEDML işlemleri için 253'ten fazla yabancı anahtar başvurusu desteklenir.UPDATEveMERGEiş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.
Important
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, SalesOrderHeader tablosundaki verilere bağlantı olmadan SalesPerson 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 ACTIONVeritabanı 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.
CASCADEsütunu yabancı anahtarın veya başvuruda bulunulan anahtarın parçasıysa belirtilmemelidir.ON DELETE CASCADEINSTEAD OF DELETEtetikleyicisi olan bir tablo için belirtilemiyor.ON UPDATE CASCADEtetikleyicileri olan tablolar içinINSTEAD OF UPDATEbelirtilemiyor.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
NULLolarak 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 UPDATEtetikleyicileri 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,
NULLotomatik olarak sütunun varsayılan değeri olur.INSTEAD OF UPDATEtetikleyicileri 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 CASCADEkontrol etmeden önce tüm SET NULL, SET DEFAULTve NO ACTION 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
DELETEveyaUPDATEnedeniyle doğrudan tüm basamaklı başvuru eylemleri önce gerçekleştirilir.Etkilenen tablolarda tanımlanmış
AFTERtetikleyicileri 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
UPDATEveyaDELETEeyleminin 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
AFTERveyaUPDATEeyleminin doğrudan hedefi olan tablodaki birDELETEtetikleyicisi, 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
UPDATEveyaDELETEişlemleri gerçekleştiriyorsa, bu eylemler ikincil basamaklı zincirleri başlatabilir. Bu ikincil zincirler, tüm birincil zincirlerdeki tüm tetikleyiciler tetiklendikten sonra herUPDATEveyaDELETEişlemi için bir kerede işlenir. Bu işlem sonrakiUPDATEveyaDELETEiş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
AFTERtetikleyici tetiklenmez ve zinciri oluşturan DELETE veya UPDATE işlemi geri alınır.INSTEAD OFtetikleyicisi olan bir tablo, basamaklı eylemi belirten birREFERENCESyan tümcesine de sahip olamaz. Ancak, basamaklı eylem tarafından hedeflenen bir tablodakiAFTERtetikleyicisi, başka bir tablodaINSERT,UPDATEveyaDELETEdeyimi yürütebilir ya da bu nesnede tanımlanan birINSTEAD OFtetikleyicisini tetikleyen görünümü görüntüleyebilir.
İlgili içerik
- Birincil Anahtarlar Oluştur
- Birincil Anahtarları silme
- Birincil Anahtarları Değiştirme
- Yabancı Anahtar İlişkileri Oluşturma
- Yabancı Anahtar İlişkilerini Değiştirme
- Yabancı Anahtar İlişkilerini Silme
- Yabancı Anahtar Özelliklerini Görüntüleme
- Çoğaltma için Yabancı Anahtar Kısıtlamalarını Devre Dışı Bırakma
- INSERT ve UPDATE Deyimleriyle Yabancı Anahtar Kısıtlamalarını Devre Dışı Bırakma