Aracılığıyla paylaş


Yabancı anahtar ilişkileri oluşturma

Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümler Azure SQL DatabaseAzure SQL Managed InstanceSQL database in Microsoft Fabric

Bu makalede, SQL Server Management Studio veya Transact-SQL kullanarak SQL Server'da yabancı anahtar ilişkilerinin nasıl oluşturulacağı açıklanır. Bir tablonun satırlarını başka bir tablonun satırlarıyla ilişkilendirmek istediğinizde, iki tablo arasında bir ilişki oluşturursunuz.

Permissions

Yabancı anahtarla yeni bir tablo oluşturmak için veritabanında CREATE TABLE izni ve tablonun oluşturulduğu şema üzerinde ALTER SCHEMA izni gerekir.

Varolan bir tabloda yabancı anahtar oluşturmak için tabloda ALTER TABLE izni gerekir.

Limitations

  • Yabancı anahtar kısıtlamasının yalnızca başka bir tablodaki birincil anahtar kısıtlamasına bağlanması gerekmez. Yabancı anahtarlar, başka bir tablodaki UNIQUE kısıtlamasının sütunlarına başvurmak için de tanımlanabilir.

  • NULL kısıtlamasının sütununa FOREIGN KEY dışında bir değer girildiğinde, girilen değer başvurulan sütunda bulunmalıdır. Aksi takdirde, yabancı anahtar ihlali hata iletisi döndürülür. Bileşik yabancı anahtar kısıtlamasının tüm değerlerinin doğrulandığından emin olmak için, katılan tüm sütunlarda NOT NULL belirtin.

  • FOREIGN KEY kısıtlamaları yalnızca aynı sunucudaki aynı veritabanındaki tablolara başvurabilir. Veritabanları arası bilgi tutarlılığı tetikleyiciler aracılığıyla uygulanmalıdır. Daha fazla bilgi için CREATE TRIGGER (Transact-SQL)bölümüne bakın.

  • FOREIGN KEY kısıtlamaları, aynı tablodaki başka bir sütuna atıfta bulunabilir ve bu da kendi kendine başvuru olarak adlandırılır.

  • Sütun düzeyinde belirtilen FOREIGN KEY kısıtlaması yalnızca bir başvuru sütununu listeleyebilir. Bu sütun, kısıtlamanın tanımlandığı sütunla aynı veri türüne sahip olmalıdır.

  • Tablo düzeyinde belirtilen FOREIGN KEY kısıtlaması, kısıtlama sütun listesindeki sütun sayısıyla aynı sayıda başvuru sütununa sahip olmalıdır. Her başvuru sütununun veri türü de sütun listesindeki ilgili sütunla aynı olmalıdır.

  • Veritabanı Altyapısı' nın, bir tablonun diğer tablolara başvuran FOREIGN KEY kısıtlama sayısı üzerinde önceden tanımlanmış bir sınırı yoktur. Veritabanı Altyapısı, belirli bir tabloya başvuran diğer tabloların sahip olduğu FOREIGN KEY kısıtlamalarının sayısını da sınırlamaz. Ancak, kullanılan FOREIGN KEY kısıtlamalarının gerçek sayısı donanım yapılandırmasıyla ve veritabanı ve uygulamanın tasarımıyla sınırlıdır. Bir tablo, yabancı anahtarlar (giden başvurular) olarak en fazla 253 diğer tabloya ve sütuna başvurabilir. SQL Server 2016 (13.x) ve sonraki sürümleri, tek bir tablodaki (gelen başvurular) sütunlara başvurabilen diğer tablo ve sütun sayısının sınırını 253'ten 10.000'e yükseltmektedir. (En az 130 uyumluluk düzeyi gerektirir.) Artış aşağıdaki kısıtlamalara sahiptir:

    • DELETE ve UPDATE DML işlemleri, 253'ten fazla yabancı anahtar başvurusunu destekler. 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 veya bellek için iyileştirilmiş tablolar için 253'ten fazla yabancı anahtar başvurusu mevcut değildir.

  • FOREIGN KEY kısıtlamaları geçici tablolarda uygulanmaz.

  • ClR kullanıcı tanımlı tür sütununda yabancı anahtar tanımlanmışsa, türün uygulanması ikili sıralamayı desteklemelidir. Daha fazla bilgi için bkz. CLR Kullanıcı Tanımlı Türler.

  • varchar(max) türünde bir sütun, yalnızca başvurduğu birincil anahtar da varchar(max) türü olarak tanımlandığında bir kısıtlamaya katılabilir.

Tablo Tasarımcısı'nda yabancı anahtar ilişkisi oluşturma

SQL Server Management Studio kullanma

  1. Nesne Gezgini'nde, ilişkinin yabancı anahtar tarafındaki tabloya sağ tıklayın ve Tasarım'ı seçin.

    Tablo, oluştur ve güncelle veritabanı tablolarıiçinde açılır.

  2. Tablo Tasarımcısı menüsünde İlişkilerseçin. (Üst bilgideki Tablo Tasarımcısı menüsüne bakın veya tablo tanımının boş alanına sağ tıklayın, ardından İlişkiler... seçin.)

  3. Yabancı Anahtar İlişkileri iletişim kutusunda Ekle'yiseçin.

    İlişki, Seçili İlişki listesinde FK_<tablename>_<tablename>biçiminde sistem tarafından sağlanan bir adla gösterilir; burada ilk tablo adı yabancı anahtar tablosunun adıdır ve ikinci tablo adı birincil anahtar tablosunun adıdır. Bu, yabancı anahtar nesnesinin (Ad) alanı için yalnızca varsayılan ve yaygın bir adlandırma kuralıdır.

  4. Seçili İlişki listesinden ilişkiyi seçin.

  5. Tablonun sağında bulunan Tablo ve Sütun Belirtimi'ni seçin ve özelliğin sağındaki üç nokta simgesini (...) seçin.

  6. Tablolar ve Sütunlar iletişim kutusundaki Birincil Anahtar açılan listesinde, ilişkinin birincil anahtar tarafındaki tabloyu seçin.

  7. Tablonun birincil anahtarına katkıda bulunan sütunları, iletişim kutusunun altındaki ızgarada seçin. Her sütunun sağında yer alan bitişik kılavuz hücresinde, yabancı anahtar tablosuna ait karşılık gelen yabancı anahtar sütununu seçin.

    Tablo Tasarımcısı ilişki için bir ad önerir. Bu adı değiştirmek için, İlişki Adı metin kutusunun içeriğini düzenleyin.

  8. İlişkiyi oluşturmak için tamam seçin.

  9. Tablo tasarımcısı penceresini kapatın ve yabancı anahtar ilişkisi değişikliğinin geçerlilik kazanması için Kaydet yaparak değişikliklerinizi kaydedin.

Yeni tabloda yabancı anahtar oluşturma

Transact-SQL kullanma

Aşağıdaki örnek, TempID veritabanındaki SalesReasonID tablosunda yer alan sütun Sales.SalesReason'i referans alan sütun AdventureWorks üzerinde bir yabancı anahtar kısıtlaması tanımlar. ON DELETE CASCADE ve ON UPDATE CASCADE yan tümceleri, Sales.SalesReason tabloda yapılan değişikliklerin Sales.TempSalesReason tabloya otomatik olarak yayılmasını sağlamak için kullanılır.

CREATE TABLE Sales.TempSalesReason (
    TempID INT NOT NULL,
    Name NVARCHAR(50),
    CONSTRAINT PK_TempSales
        PRIMARY KEY NONCLUSTERED (TempID),
    CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
        REFERENCES Sales.SalesReason(SalesReasonID)
    ON DELETE CASCADE
    ON UPDATE CASCADE
);

Mevcut tabloda yabancı anahtar oluşturma

Transact-SQL kullanma

Aşağıdaki örnek, TempID veritabanındaki SalesReasonID tablosundaki Sales.SalesReason sütununa başvuran bir yabancı anahtarı AdventureWorks sütununda oluşturur.

ALTER TABLE Sales.TempSalesReason
ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
REFERENCES Sales.SalesReason (SalesReasonID)
   ON DELETE CASCADE
   ON UPDATE CASCADE;