Aquí hay una simplificación excesiva 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 ambos table_1
y table_2
.
table_1 (id, field)
table_2 (id, field, field)
info ( ???, field)
Estoy tratando de decidir si debo hacer la clave principal de info
un compuesto de las 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 (me imagino por qué esto es malo)
VARCHAR (10)
11209-437
DECIMAL (10,4)
11209.437
¿O algo mas?
¿Estaría bien usar esto como la Clave primaria en un MYSQL MYISAM DB?
Respuestas:
Usaría una clave compuesta (varias columnas).
De esta manera, también puede tener t1ID y t2ID como claves externas que apuntan a sus tablas respectivas.
fuente
UPDATE info ... WHERE t1ID=11209 AND t2ID=437
.No haría que la clave primaria de la tabla "info" sea un compuesto de los dos valores de otras tablas.
Otros pueden expresar mejor las razones, pero se siente mal tener una columna que realmente esté compuesta de dos datos. ¿Qué sucede si desea ordenar el ID de la segunda tabla por alguna razón? ¿Qué sucede si desea contar la cantidad de veces que un valor de cualquiera de las tablas está presente?
Siempre los mantendría como dos columnas distintas. Podría usar una clave primaria 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 primaria de incremento automático.
fuente
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 crea la tabla, por ejemplo:
Para agregar esta restricción a una tabla existente, debe seguir la siguiente sintaxis
fuente
Supongamos que ya ha creado una tabla, ahora puede usar esta consulta para hacer una clave primaria compuesta
fuente
Además de las preferencias de diseño personal, hay casos en los que uno quiere hacer uso de 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 EE. UU. Tiene un conjunto de distritos del Congreso únicos. Si bien muchos estados pueden tener individualmente un CD-5, nunca habrá más de un CD-5 en ninguno de los 50 estados, y viceversa. Por lo tanto, crear un campo de numeración automática para Massachusetts CD-5 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 numerada automáticamente.
Entonces, aunque no estoy respondiendo la pregunta original, ciertamente aprecio la respuesta directa de Adam.
fuente
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 de vacaciones que incluya varias propiedades. Por otro lado, la propiedad también podría estar disponible como parte de una serie de paquetes de alquiler, ya sea solo o con otras propiedades. En este escenario, establece la relación entre la propiedad y el paquete de alquiler con una tabla de hechos de propiedad / paquete. 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.
fuente
fuente
@AlexCuse Quería agregar esto como comentario a su respuesta, pero me di por vencido después de hacer varios 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:
La Tabla_1 tiene:
Id Campo
1 A
2 B
Table_2 tiene:
Id Campo
1 X
2 Y
INFO puede tener:
t1ID t2ID campo
1 1 algunos
1 2 datos
2 1 en cada uno
fila 2 2
Entonces, en la tabla INFO para identificar de forma exclusiva una fila, necesita t1ID y t2ID
fuente