tablas tabla primaria llaves llave con compuestas compuesta clave agregar mysql primary-key myisam composite-key composite-primary-key

mysql - primaria - tabla compuesta sql server



Cómo crear correctamente claves primarias compuestas-MYSQL (8)

Aquí hay una sobresimplificación burda de una configuración intensa con la que estoy trabajando. table_1 y table_2 ambos tienen claves primarias sustitutas de incremento automático como ID. info es una tabla que contiene información sobre table_1 y table_2 .

table_1 (id, field) table_2 (id, field, field) info ( ???, field)

Estoy tratando de decidir si debo hacer que la clave primaria de info un compuesto de los ID de table_1 y table_2 . Si tuviera que hacer esto, ¿cuál de estos tiene más sentido?
(en este ejemplo, estoy combinando ID 11209 con ID 437)

INT(9) 11209437 (puedo imaginar por qué esto es malo)
VARCHAR (10) 11209-437
DECIMAL (10,4) 11209.437

¿O algo mas?

¿Estaría bien utilizar esto como la clave principal en un MYSQL MYISAM DB?


@AlexCuse Quería agregar esto como un comentario a su respuesta, pero desistí después de hacer múltiples intentos fallidos para agregar nuevas líneas en los comentarios.

Dicho esto, t1ID es único en la tabla_1, pero eso no lo hace único en la tabla INFO también.

Por ejemplo:

Table_1 tiene:
Id Field
1 A
2 B

Table_2 tiene:
Id Field
1 X
2 Y

INFO puede tener:
t1ID campo t2ID
1 1 algunos
1 2 datos
2 1 en cada uno
2 2 fila

Por lo tanto, en la tabla INFO para identificar de forma única una fila, necesita tanto t1ID como t2ID


Además de las preferencias de diseño personal, hay casos en los que se desea utilizar claves primarias compuestas. Las tablas pueden tener dos o más campos que proporcionan una combinación única, y no necesariamente por medio de claves externas.

Como ejemplo, cada estado de los EE. UU. Tiene un conjunto de distritos congresionales únicos. Si bien muchos estados pueden tener un CD-5 individualmente, nunca habrá más de un CD-5 en ninguno de los 50 estados, y viceversa. Por lo tanto, la creación de un campo de autonumeración para el CD-5 de Massachusetts sería redundante.

Si la base de datos maneja una página web dinámica, escribir código para consultar en una combinación de dos campos podría ser mucho más simple que extraer / volver a enviar una clave autonumerada.

Entonces, aunque no estoy respondiendo la pregunta original, ciertamente aprecio la respuesta directa de Adam.


Las claves primarias compuestas son lo que desea donde desea crear una relación de muchos a muchos con una tabla de hechos. Por ejemplo, es posible que tenga un paquete de alquiler vacacional que incluya una serie de propiedades. Por otro lado, la propiedad también podría estar disponible como parte de una serie de paquetes de alquiler, ya sea por sí misma o con otras propiedades. En este escenario, establece la relación entre la propiedad y el paquete de alquiler con una tabla de propiedad / paquete de hechos. La asociación entre una propiedad y un paquete será única, solo se unirá usando property_id con la tabla de propiedades y / o package_id con la tabla de paquetes. Cada relación es única y una clave auto_increment es redundante, ya que no aparecerá en ninguna otra tabla. Por lo tanto, definir la clave compuesta es la respuesta.


No convertiría la clave principal de la tabla "información" en un compuesto de los dos valores de otras tablas.

Otros pueden articular mejor las razones, pero se siente mal tener una columna que realmente esté formada por dos piezas de información. ¿Qué sucede si quiere ordenar el ID de la segunda tabla por algún motivo? ¿Qué sucede si desea contar la cantidad de veces que un valor de cualquiera de las tablas está presente?

Yo siempre los mantendría como dos columnas distintas. Puede usar una clave principal de dos columnas en mysql ... PRIMARY KEY (id_a, id_b) ... pero prefiero usar un índice único de dos columnas y tener un campo de clave principal de incremento automático.


Supongamos que ya ha creado una tabla ahora puede usar esta consulta para crear una clave primaria compuesta

alter table employee add primary key(emp_id,emp_name);


Yo usaría una clave compuesta (multi columna).

CREATE TABLE INFO ( t1ID INT, t2ID INT, PRIMARY KEY (t1ID, t2ID) )

De esta forma, puede tener t1ID y t2ID como claves externas que apuntan a sus respectivas tablas también.


la sintaxis es CONSTRAINT constraint_name PRIMARY KEY(col1,col2,col3) por ejemplo ::

CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)

el ejemplo anterior funcionará si lo está escribiendo mientras está creando la tabla, por ejemplo ::

CREATE TABLE person ( P_Id int , ............, ............, CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName) );

para agregar esta restricción a una tabla existente, debe seguir la siguiente sintaxis

ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (P_Id,LastName)


CREATE TABLE `mom`.`sec_subsection` ( `idsec_sub` INT(11) NOT NULL , `idSubSections` INT(11) NOT NULL , PRIMARY KEY (`idsec_sub`, `idSubSections`) );