2012-10-01 33 views
6

¿Es posible que la clave externa de una tabla forme parte de la clave primaria compuesta de otra tabla? Por ejemplo, si tengo dos tablas, una contiene información sobre todos los proyectos activos de los diferentes usuarios y otra con información sobre qué equipo está siendo utilizado por los proyectos:Clave externa de tabla SQL que es parte de una clave primaria compuesta

Tabla Proyecto:

Composite Primary Keys: UserId, ProjectId (ni son únicas por sí mismos)

Equipo Tabla:

Composite Primary Keys: UserId, ProjectId, EquipmentId (ni son únicos por sí mismos)

Ahora es que po ¿Es posible configurar ProjectId en la tabla de equipos para que sea una clave externa de la tabla de proyectos? Cuando lo intento, aparece un error que dice que la columna en la Tabla de proyectos no coincide con una clave principal existente o una restricción única.

+0

¿Cómo se ha definido la clave primaria compuesta? ¿Ha agregado una restricción única en _each_ column? – Oded

+0

Pero no quiero que cada columna sea única. Quiero que una combinación de dos o tres columnas sea única. – Tony

+0

Le pregunté cómo definió las restricciones. No dije que debieras definirlos de esa manera. – Oded

Respuesta

8

Cuando se crea una clave externa, la clave que "a punto de" en la otra tabla debe ser una restricción UNIQUE o PRIMARY KEY. No puede establecer una clave externa que apunte a una columna que permita valores duplicados. Sería muy difícil imaginar cómo deberían "actuar" los datos si actualiza uno de los valores duplicados en la otra tabla (por ejemplo).

Para hacer lo que desee, debe establecer una tabla de Proyectos en la que ProjectID es ÚNICO o una LLAVE PRINCIPAL y luego señalar claves foráneas en ambas las otras tablas de esa tabla.

Entre paréntesis, utiliza el término "Claves principales" para describir las columnas en cada tabla que componen la clave principal. De hecho, cada tabla puede tener una y solo una clave principal. Esa clave puede estar compuesta por una o más columnas, pero la clave misma todavía se refiere al singular. Esta es una diferencia importante cuando se usa la clave principal para optimizar las búsquedas.

-1

@Larry Lustig La clave externa puede ser parte de la clave primaria en la otra tabla.

fuente: Dependent relationship

Comprobar relación entre tablas: Zdarzenie (Event) y TypZdarzenia (tipo de evento)

football Competition - database

0

Es que no sé si eso es una buena práctica de diseño, pero seguro que es posible tener una clave foránea compuesta de una tabla que es la parte de la clave primaria compuesta de otra tabla.

decir que tenemos una tabla test1 que tienen una clave principal compuesta (A, B)

Ahora podemos tener una tabla decir test2 tener clave primaria (P, Q, R), donde en (P, Q) de test2 haciendo referencia (A, B) de test2.

Ejecuté la siguiente secuencia de comandos en la base de datos MySql y funciona muy bien.

CREATE TABLE `test1` (
`A` INT NOT NULL, 
`B` VARCHAR(2) NOT NULL, 
`C` DATETIME NULL, 
`D` VARCHAR(45) NULL, 
PRIMARY KEY (`A`, `B`)); 


CREATE TABLE `test2` (
`P` INT NOT NULL, 
`Q` VARCHAR(2) NOT NULL, 
`R` INT NOT NULL, 
`S` DATETIME NULL, 
`T` VARCHAR(8) NULL, 
PRIMARY KEY (`P`, `Q`, `R`), 
INDEX `PQ_idx` (`P`,`Q` ASC), 
CONSTRAINT `PQ` 
    FOREIGN KEY (`P`, `Q`) 
    REFERENCES `test1` (`A`,`B`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE); 

En el caso mencionado anteriormente, la base de datos está esperando la combinación de (A, B) a ser único y es, al ser una clave primaria en la tabla test1.


Pero si intenta hacer algo como siguiente, el guión sería un fracaso. La base de datos no le permite crear la tabla test2.

CREATE TABLE `test2` (
`P` INT NOT NULL, 
`Q` VARCHAR(2) NULL, 
`R` DATETIME NULL, 
`S` VARCHAR(8) NULL, 
`T` VARCHAR(45) NULL, 
    INDEX `P_idx` (`P` ASC), 
    INDEX `Q_idx` (`Q` ASC), 
    CONSTRAINT `P` 
    FOREIGN KEY (`P`) 
    REFERENCES `test1` (`A`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    CONSTRAINT `Q` 
    FOREIGN KEY (`Q`) 
    REFERENCES `test1` (`B`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE); 

En el caso mencionado anteriormente la base de datos podría esperar que la columna A sea única individual y la misma sigue para la columna B. No importa si la combinación de (A, B) es única.

Cuestiones relacionadas