2011-04-07 24 views
16

Esta debería ser una pregunta bastante sencilla, pero no puedo encontrar una respuesta fácil. ¿Cómo se crea una clave externa que también es una clave principal en MySQL? Aquí está mi intento actual:¿Cómo crear una clave externa que también es una clave principal en MySQL?

CREATE TABLE Sale(
    sale_id CHAR(40), 
    PRIMARY KEY(sale_id), 
    discount DOUBLE, 
    type VARCHAR(255), 
    price DOUBLE, 
    ); 

CREATE TABLE Normal_Sale(
    sale_id CHAR(40), 
    PRIMARY KEY(sale_id); 
); 

CREATE TABLE Special_Sale(
    sale_id CHAR(40), 
    PRIMARY KEY(sale_id); 
); 

¿Qué me falta aquí?

Gracias de antemano.

+3

Este diseño no se ve bien. Para mí, parece que podría agregar un campo a la Venta, que lo marca como Normal o Especial. Esto huele a –

+0

Estás * sobre normalizando * el esquema. Como dice Joe Phillips, existe una solución mucho más simple. Su diseño podría provocar dolores de cabeza ya que los dos estados deberían ser mutuamente excluyentes (ya sean normales o especiales), ¿qué impide que una venta se registre como especial y normal en su esquema? * Código *, dices? Eso es; ese es el dolor de cabeza que no necesitas. –

+3

Estos son solo ejemplos falsos. La pregunta no es una pregunta de diseño, es una pregunta técnica. – user456584

Respuesta

35

Añadir FOREIGN KEY (sale_id) REFERENCES Sale(sale_id) a cada tabla externa:

CREATE TABLE Sale(
    sale_id CHAR(40), 
    PRIMARY KEY(sale_id), 
    discount DOUBLE, 
    type VARCHAR(255), 
    price DOUBLE 
) ENGINE=INNODB; 

CREATE TABLE Normal_Sale(
    sale_id CHAR(40), 
    PRIMARY KEY(sale_id), 
    FOREIGN KEY (sale_id) REFERENCES Sale(sale_id) 
) ENGINE=INNODB; 

CREATE TABLE Special_Sale(
    sale_id CHAR(40), 
    PRIMARY KEY(sale_id), 
    FOREIGN KEY (sale_id) REFERENCES Sale(sale_id) 
) ENGINE=INNODB; 

Sólo asegúrese de que su base de datos es InnoDB que apoya Referencias Exteriores.

+1

Esto responde mi pregunta. ¡Gracias! – user456584

Cuestiones relacionadas