Bir tablo neden birincil anahtarını kendisine yabancı anahtar olarak kullanır?


21

Bir veritabanına bakarak, birincil anahtarını kendisine yabancı anahtar olarak kullanan bir masaya rastladım.

Bir tablonun bir hiyerarşi yapısı oluşturmak için kendisine yabancı bir anahtarı olabileceğini gördüm, ancak birincil anahtara başvurmak için başka bir sütun kullanacağını gördüm.

Birincil anahtar benzersiz olduğundan, bu durumda satır yalnızca kendisine işaret edebilir mi? Bu, totolojik bir bağlantı gibi gözüküyor, çünkü zaten bir sırasım varsa, o zaman zaten sıram var.

Bunun yapılmasının bir nedeni var mı?

Tablo kendine katıldı

Kısıtlamanın bu şekilde yazıldığından eminim (sadece şemaya bakmadan), çünkü aynı tablo ve sütun tanımın her iki yarısı için de kullanılır.


6
Büyük olasılıkla tasarımcı tarafından verilen çuval kullanımı sayesinde benim teorim
Martin Smith

Yanıtlar:


28

Dediğin gibi. FOREIGN KEYAynı tabloya atıfta bulunan bir kısıtlama tipik olarak bir hiyerarşi yapısı içindir ve birincil anahtara başvurmak için başka bir sütun kullanır. İyi bir örnek, çalışanların bir tablosu:

EmployeeId    Int     Primary Key
EmployeeName  String
ManagerId     Int     Foreign key going back to the EmployeeId

Öyleyse bu durumda masadan kendi kendine dönen bir yabancı anahtar var. Tüm yöneticiler aynı zamanda çalışanlardır, bu nedenle ManagerIdaslında EmployeeIdyöneticinin yöneticisidir.

Şimdi, diğer yandan, eğer birisinin EmployeeIdyabancı anahtarı Çalışan masasına geri getirdiğini söylüyorsanız , o zaman muhtemelen bir hataydı . Bir test yaptım ve mümkün ancak gerçek bir kullanımı olmayacaktı.

CREATE TABLE Employee (EmployeeId Int PRIMARY KEY,
                        EmployeeName varchar(50),
                        ManagerId Int);


ALTER TABLE Employee ADD CONSTRAINT fk_employee 
    FOREIGN KEY (EmployeeId) REFERENCES Employee(EmployeeId);

1
Bu durumda, Çalışan Kimliği ile ilgili Yönetici Kimliğine bir kısıtlama getirmek, Müdürün "ayrılması" durumunda faydalı olabilir. Bu şekilde ayarlanırsa satırın silinmesine izin verilmez. Bu şekilde yapacağımı söylememekle birlikte, başvurunuz yöneticilere sahip çalışanlara güvenirse faydası olabilir.
zgr024

6

Kendi db'mde böyle bir yabancı anahtar buldum ve kendimi yaratıyor olmalı. Sanırım bu sadece tesadüfen oldu. Birincil anahtarlı bir tablonun bağlam menüsünde "Yeni Yabancı Anahtar" ı tıklarsam (Management Studio, SQL 2014 Express içinde) bu zaten otomatik olarak kendisine atıfta bulunan böyle bir yabancı anahtar oluşturur. Aşağıya bakınız:

görüntü tanımını buraya girin

O zaman yeni bir tane eklemek yerine bir tanesini değiştirmem gerektiğini bilmiyorsam, orada kalacak. Ya da, sadece [İptal] gibi olacağını gösteren [Kapat] düğmesine tıklarsam, tablo tanımını kaydettikten sonra yabancı anahtar yine de oluşturulur.

Bu yüzden, bana göre böyle bir Yabancı Anahtar hiçbir anlam ifade etmiyor ve kaldırılabiliyor.


Bir FK oluşturmak istemeniz ve diğer masanın PK'sini henüz ayarlamadığını fark ettiğiniz sürece iptal etmelisiniz, diğer masaya gidersiniz ve bir nedenden dolayı FK sürecine devam etmeyi unutursunuz. Orada özyinelemeli FK'niz var.
Andrew,

4

Belki tasarımcı kullanımını engellemek istedi TRUNCATE TABLE?

TRUNCATE TABLEBir yabancı anahtar kısıtlaması ile bir masada kullanılamaz başka bir masaya olsa edebilirsiniz varsa kullanılabilir özüne yabancı tuşları. TRUNCATE TABLE (Transact-SQL) belgesinden :

BOL Ekstresi

Bir DELETEbir olmadan açıklamada WHEREmaddesi bir benzer etkiye sahiptir TRUNCATE TABLE(tablodaki tüm satırları kaldırma) ama DELETEdeyim izin vermek için bir nedeni olabilir silme tetikler, ateşler DELETEama TRUNCATE TABLE.

Bunu izinleri kullanarak yapardım ( DELETEsilme izni TRUNCATE TABLEgerektirir , tablo iznini değiştirmeyi gerektirir), ama tasarımcının bunu yapamamasının bir nedeni olabilir mi?

Not: Tasarımcının yaptığı şey aslında kullanımını engellemese TRUNCATE TABLEde, bunun niyeti olduğunu iddia ediyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.