2012-03-20 17 views
11

tutaj są moje dwie tablice dotyczą:klucz Composite jako klucz obcy (SQL)

CREATE TABLE IF NOT EXISTS `tutorial` (
    `beggingTime` time NOT NULL, 
    `day` varchar(8) NOT NULL, 
    `tutorId` int(3) NOT NULL, 
    `maxMembers` int(2) NOT NULL, 
    `minMembers` int(1) NOT NULL, 
    PRIMARY KEY (`beggingTime`,`day`,`tutorId`), 
    KEY `tutorId` (`tutorId`) 
) 


CREATE TABLE IF NOT EXISTS `group` (
    `groupId` tinyint(3) NOT NULL AUTO_INCREMENT, 
    `status` varchar(20) NOT NULL, 
    `groupName` varchar(50) NOT NULL, 
    PRIMARY KEY (`groupId`) 
) 

Chciałbym utworzyć pole w „grupy”, które odwołują się do złożonych unikatowych kluczy w „poradniku”. Sądzę więc, że moje pytanie brzmi: jak odnieść te tabele? czy muszę utworzyć pole kluczy obcych w "grupie" dla każdego klucza podstawowego w "samouczku"?

+0

Czy chcesz relacji 1: 1, 1: n, n: 1 lub n: m? tj. ile samouczków dla ilu grup? – Aprillion

Odpowiedz

19

Per the mySQL documentation powinieneś być w stanie ustawić odwzorowanie klucza obcego na kompozyty, co będzie wymagało utworzenia wielu kolumn.

Dodaj kolumny i umieścić to w tabeli group

FOREIGN KEY (`beggingTime`,`day`,`tutorId`) 
    REFERENCES tutorial(`beggingTime`,`day`,`tutorId`) 

Jak Steven wspomniał w komentarzach poniżej, należy spróbować ponownie architekta to tak, że tabela poradnik wykorzystuje rzeczywiste klucz podstawowy (nawet jeśli jest to tylko klucz zastępczy tożsamości). Umożliwi to większą wydajność, ponieważ SQL został zbudowany dla tego typu relacji, a nie złożony.

+2

Choć może to być możliwe, musi to być surowe. Klucze podstawowe zamapowane na klucze obce są w zasadzie standardem branżowym. –

+0

@SteveWellens Dzięki, zaktualizowałem swoją odpowiedź na podstawie Twojego komentarza, ponieważ masz rację i powinienem był wspomnieć, że wraz z bezpośrednią odpowiedzią w pierwszej kolejności –

+2

OSTRZEŻENIE: kolumny z odnośnikami muszą być w tej samej kolejności, w jakiej były kluczowe utworzony w. Aby uzyskać prawidłową kolejność, kliknij prawym przyciskiem myszy klucz obcy (w folderze kluczy, gdy rozwijasz tabelę w SSMS), a skrypt utwórz w schowku. Pasta. Upewnij się, że kolumny z odniesieniami są w tej samej kolejności co klucz. – Trevor

0

1] przepisać pierwszy stół: najpierw wstawiając tutorId, sam jest automatycznie kluczem. W rzeczywistości wszystkie, oprócz ostatniej kolumny złożonej, stają się kluczem.

CREATE TABLE IF NOT EXISTS `tutorial` (
`beggingTime` time NOT NULL, 
`day` varchar(8) NOT NULL, 
`tutorId` int(3) NOT NULL, 
`maxMembers` int(2) NOT NULL, 
`minMembers` int(1) NOT NULL, 
PRIMARY KEY mykey (`tutorId`,`beggingTime`,`day`) 
) 

2] Posiadanie tak wielu indeksów jest bardzo drogie przy dużych tablicach pisania. Więc rozważ dodatkowe pole w samouczku, aby użyć go jako klucza obcego; być może auto_increment record_id. Daj mu trochę myśli.