2012-03-20 20 views
11

qui sono i miei due tavoli di preoccupazione:chiave composita come chiave esterna (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`) 
) 

vorrei creare un campo nel 'gruppo' che collegherebbe le chiavi univoche compositi in 'esercitazione'. Quindi immagino che la mia domanda sia, come faccio a mettere in relazione questi tavoli? devo creare campi di chiavi esterne in "gruppo" per ogni chiave primaria in "tutorial"?

+0

vuoi 1: 1, 1: n, n: 1 o n: m rapporto? cioè quanti tutorial per quanti gruppi? – Aprillion

risposta

19

Per the mySQL documentation si dovrebbe essere in grado di impostare una mappatura di chiave esterna su materiali compositi, che richiederà la creazione di più colonne.

Aggiungere le colonne e mettere questo nel vostro group tavolo

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

Come Steven ha accennato nei commenti qui sotto, si dovrebbe provare a re-architetto questo in modo che la tabella tutorial utilizza una chiave primaria effettiva (anche se è solo una chiave surrogata dell'identità). Ciò consentirà prestazioni migliori in quanto SQL è stato creato per questo tipo di relazione, non composita.

+2

Anche se potrebbe essere possibile, questo ha avuto una severa penalizzazione delle prestazioni. Le chiavi primarie mappate su chiavi esterne sono praticamente lo standard del settore. –

+0

@SteveWellens Grazie, ho aggiornato la mia risposta in base al tuo commento, come hai ragione e avrei dovuto menzionarlo insieme alla risposta diretta in primo luogo –

+2

ATTENZIONE: le colonne di riferimento devono essere nello stesso ordine in cui la loro chiave era creato in. Per ottenere l'ordine corretto, fare clic con il tasto destro sulla chiave esterna (sotto la cartella keys quando si espande la tabella in SSMS) e creare script negli appunti. Incolla. Assicurati che le colonne di riferimento siano nello stesso ordine della tua chiave. – Trevor

0

1] riscrivi la prima tabella: inserendo prima tutorId, è automaticamente una chiave tutta da sola. In effetti, tutto tranne l'ultimo delle colonne composte diventa una chiave.

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] Avere così tanti indici è molto costoso per le tabelle di scrittura pesanti. Quindi considera un campo aggiuntivo nel tutorial da usare come chiave esterna; forse un record_id autoincremento. Dagli qualche idea.

Problemi correlati