2015-04-16 174 views
0
create table Atable ( 
a int, primary key(a) 
); 

create table Btable (
b int, primary key(b) 
); 

create table Ctable (
a int, b int, 
foreign key(a) references Atable(a), 
foreign key(b) references Btable(b), //i dont want to these to be foreign keys, just two primary keys.. so a composite key. 
primary key(a, b) 
); 

如何使表C具有Atable和Btable的外鍵主鍵?如何從兩個外鍵合成一個組合? MySQL

對不起,如果我不清楚。對不起,如果這是不可能的。在此先感謝

+0

表只能有一個主鍵。 (它也可以有其他的鍵,但不是主鍵......)你想達到什麼目的?學校工作? – jarlh

+1

這是可能的。您可以擁有由多個列組成的主鍵。這些列也可以是其他表的外鍵。看起來你在A和B之間有多對多的關係。那麼這使C成爲中間表? – alkis

+1

我沒有得到這個問題,我不能嘗試它,但你的代碼似乎很好,應該工作。 – Andre

回答

1

一個字段可以是外鍵,主鍵,兩者或兩者都不。 CTable是ATable和BTable之間的交集,用於實現它們之間的多對多關係。使用交集表時,通常將兩個外鍵都作爲表的複合主鍵。

這可以防止重複的關係。 ATable中的一行可以與BTable中的許多行相關,但它不能與多個行中的同一行相關(反之亦然)。

Create table CTable(
    a int not null, 
    b int not null, 
    foreign key(a) references ATable(a), 
    foreign key(b) references BTable(b), 
    primary key(a, b) 
); 

因此,如果您嘗試插入行中CTable這樣的:

A1 B1 
A1 B2 
A2 B3 
A3 B1 
A3 B3 
A3 B1 --> Not allowed 

最後組合(A3,B1)將不會被允許的,因爲它已經輸入到表格。在相同的兩行之間定義多個關係是沒有意義的。