2012-10-01 24 views
6

Bir tablonun yabancı anahtarının başka bir tablonun birleşik birincil anahtarının bir parçası olması mümkün mü?Bir Kompozit Birincil Anahtarın parçası olan SQL Tablo Yabancı Anahtarı

Proje Tablo:

Composite Primary Keys: UserId, ProjectId (ne benzersizdir İki tablo varsa Örneğin, biri farklı kullanıcıların tüm aktif projeler ve projelerin tarafından kullanılıyor hangi ekipman başka içeren verileri içerir

Composite Primary Keys: UserId, ProjectId, EquipmentId (ne

Şimdi ise) kendileri tarafından özeldir o po:

Ekipman Tablo) kendileri tarafından ProjectId'i, tablo tablosunda, proje tablosundan yabancı bir anahtar olacak şekilde ayarlamak mümkün mü? Denediğimde, Proje Tablosundaki sütunun mevcut bir birincil anahtarla veya benzersiz bir kısıtla eşleşmediğini söyleyen bir hata alıyorum.

+0

Birleşik birincil anahtarı nasıl tanımladınız? _each_ sütununda benzersiz bir kısıtlama eklediniz mi? – Oded

+0

Ancak, her sütunun benzersiz olmasını istemiyorum. İki ya da üç sütunun bir kombinasyonu benzersiz olmak istiyorum. – Tony

+0

Kısıtlamaları nasıl tanımladığınızı sordum. Onları böyle tanımlamalısın demedim. – Oded

cevap

8

yabancı bir anahtar oluşturmak sayılı

, siz "nokta" diğer tablodaki bir EŞSİZ veya birincil anahtar kısıtlaması olmalıdır tuşuna basın. Yinelenen değerlere izin veren bir sütuna işaret eden bir yabancı anahtar oluşturamazsınız. Diğer tabloda (örneğin) yinelenen değerlerden birini güncellerseniz, verilerin "nasıl davranması" gerektiğini hayal etmek çok zor olurdu.

Eğer ProjectID EŞSİZ olduğu bir Projeleri tablo veya bir PRIMARY KEY kurmak ve daha sonra her iki bu tabloya diğer tablolarda yabancı anahtarları işaret etmelidir istediklerini yapmak için.

Parantez içinde, birincil anahtar oluşturan her tablodaki sütunları tanımlamak için "Birincil Tuşlar" terimini kullanırsınız. Aslında, her bir tablonun bir ve sadece bir tane birincil anahtarı olabilir. Bu anahtar bir veya daha fazla sütuntan oluşabilir, ancak anahtarın kendisi hala tekil olarak adlandırılır. Aramaları optimize etmek için birincil anahtarı kullanırken bu önemli bir farktır.

-1

@Larry Lustig Yabancı anahtar, diğer tabloda birincil anahtarın parçası olabilir.

kaynak: tablolar arasında Dependent relationship

Kontrol ilişki: Zdarzenie (Olay) ve TypZdarzenia (olayın tipi)

football Competition - database

0

bu iyi bir tasarım uygulamadır eğer bilmiyorum ama herhalde Diğer tablonun birleşik ana anahtarının bir parçası olan bir tablonun birleşik bir dış anahtarının bulunması mümkündür.

biz sahip test2 demek bir birincil anahtar (A, B)

Şimdi bir tablo olabilir sahip olan bir masa test1 var ki birincil anahtar (P, Q, R) burada (P, Q) içinde Test2'nin test2 referansı (A, B).

Aşağıdaki komut dosyasını MySql veritabanında çalıştırdım ve gayet iyi çalışıyor.Yukarıda belirtilen durumda

CREATE TABLE `test2` (
`P` INT NOT NULL, 
`Q` VARCHAR(2) NOT NULL, 
`R` INT NOT NULL, 
`S` DATETIME NULL, 
`T` VARCHAR(8) NULL, 
PRIMARY KEY (`P`, `Q`, `R`), 
INDEX `PQ_idx` (`P`,`Q` ASC), 
CONSTRAINT `PQ` 
    FOREIGN KEY (`P`, `Q`) 
    REFERENCES `test1` (`A`,`B`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE); 


CREATE TABLE `test1` (
`A` INT NOT NULL, 
`B` VARCHAR(2) NOT NULL, 
`C` DATETIME NULL, 
`D` VARCHAR(45) NULL, 
PRIMARY KEY (`A`, `B`)); 

, veritabanı kombinasyonu bekliyor, (A, B), benzersiz olması ve Test1 tabloda birincil anahtar olmak vardır.


Ama aşağıdaki gibi bir şey yapmak çalışırsanız, komut başarısız olur. Veritabanı, test2 tablosunu oluşturmanıza izin vermez. kombinasyonu (A, B) benzersiz olup olmadığını önemli değildir yukarıda belirtilen vaka veritabanında

CREATE TABLE `test2` (
`P` INT NOT NULL, 
`Q` VARCHAR(2) NULL, 
`R` DATETIME NULL, 
`S` VARCHAR(8) NULL, 
`T` VARCHAR(45) NULL, 
    INDEX `P_idx` (`P` ASC), 
    INDEX `Q_idx` (`Q` ASC), 
    CONSTRAINT `P` 
    FOREIGN KEY (`P`) 
    REFERENCES `test1` (`A`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    CONSTRAINT `Q` 
    FOREIGN KEY (`Q`) 
    REFERENCES `test1` (`B`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE); 

A sütunu ayrı ayrı benzersiz olması beklenir ve aynı kolon B için izler.

İlgili konular