2012-03-20 17 views
11

aquí están mis dos mesas de preocupación:Clave múltiple como clave externa (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`) 
) 

Me gustaría crear un campo en el 'grupo' que uniría a las claves únicas compuestas en 'tutorial'. Así que supongo que mi pregunta es, ¿cómo relaciono estas tablas? ¿Tengo que crear un campo de claves externas en 'grupo' para cada clave principal en 'tutorial'?

+0

¿quieres 1: 1, 1: n, n: 1 o n: m relación? es decir, ¿cuántos tutoriales para cuántos grupos? – Aprillion

Respuesta

19

Per the mySQL documentation debe ser capaz de configurar una asignación de clave externa a compuestos, lo que requerirá que cree las columnas múltiples.

Añadir las columnas y poner esto en su mesa group

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

Como Steven ha aludido en los comentarios a continuación, usted debe tratar de modificar la arquitectura de este modo que la mesa tutorial usa una clave primaria real (incluso si solo es una clave sustituta de identidad). Esto permitirá un mayor rendimiento ya que SQL fue creado para este tipo de relación, no compuesta.

+2

Si bien puede ser posible, esto tiene que tener una grave penalización de rendimiento. Las claves primarias asignadas a claves externas es prácticamente el estándar de la industria. –

+0

@SteveWellens Gracias, actualicé mi respuesta basándome en su comentario, ya que tiene razón y debería haber mencionado eso junto con la respuesta directa en primer lugar –

+2

ADVERTENCIA: las columnas a las que se hace referencia deben estar en el mismo orden en que estaban clave creado en. Para obtener el orden correcto, haga clic con el botón secundario en la clave externa (debajo de la carpeta de claves cuando expanda la tabla en SSMS) y cree una secuencia de comandos en el portapapeles. Pegar. Asegúrese de que las columnas a las que hace referencia estén en el mismo orden que su clave. – Trevor

0

1] reescriba la primera tabla: al poner tutorId primero, es automáticamente una clave por sí mismo. De hecho, todas menos la última de las columnas compuestas se convierten en una clave.

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] Tener tantos índices es muy caro para tablas de escritura pesadas. Considere un campo adicional en el tutorial para usar como clave externa; quizás un auto_increment record_id. Dale algunos pensamientos.

Cuestiones relacionadas