Cómo crear correctamente claves primarias compuestas - MYSQL


Aquí hay una gran simplificación de una configuración intensa con la que estoy trabajando. table_1 y table_2 ambos tienen claves primarias sustitutivas 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 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 más?

¿Estaría bien usar esto como Clave Primaria en una base de datos MYSQL MYISAM?

Author: filip, 2011-04-29

8 answers

Usaría una clave compuesta (de varias columnas).

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

De esta manera puede tener t1ID y t2ID como claves foráneas apuntando a sus respectivas tablas también.

 270
Author: AlexCuse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-29 18:47:09

No haría que la clave principal de la tabla "info" sea un compuesto de los dos valores de otras tablas.

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

Siempre las mantendría como dos columnas distintas. Podrías usar una columna de dos clave primay en mysql ...CLAVE PRIMARIA (id_a, id_b)... pero prefiero usar un índice único de dos columnas y tener un campo de clave primaria de incremento automático.

 17
Author: wmorse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-29 19:27:45

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 escribes mientras creas 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)
 12
Author: Ritabrata Gautam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-08 16:07:10

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 su cuenta o con otras propiedades. En este escenario, se establece la relación entre la propiedad y el paquete de alquiler con una tabla de datos de propiedad/paquete. El 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.

 4
Author: Adam Penny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-12 18:43:43

Aparte de las preferencias personales de diseño, 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 foráneas.

Como ejemplo, cada estado de los Estados Unidos tiene un conjunto de distritos congresionales ú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, creando un campo autonumber 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 autonumerada.

Así que aunque no estoy respondiendo la pregunta original, ciertamente aprecio la respuesta directa de Adán.

 3
Author: KiloVoltaire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-17 11:15:26

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

alter table employee add primary key(emp_id,emp_name);
 3
Author: Usman Yaqoob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-23 06:19:34
CREATE  TABLE `mom`.`sec_subsection` (

  `idsec_sub` INT(11) NOT NULL ,

  `idSubSections` INT(11) NOT NULL ,

  PRIMARY KEY (`idsec_sub`, `idSubSections`) 

);
 1
Author: Master Mind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-18 14:49:00

@AlexCuse Quería agregar esto como comentario a su respuesta, pero se rindió después de hacer varios intentos fallidos para agregar nuevas líneas en los comentarios.

Dicho esto, t1ID es único en table_1, pero eso no lo hace único en INFO table también.

Por ejemplo:

Table_1 tiene:
Campo Id
1 A
2 B

Table_2 tiene:
Campo Id
1 X
2 Y

INFO entonces puede tener:
t1ID Campo t2ID
1 1 algunos
1 2 datos
2 1 in-each
2 2 fila

Por lo tanto, en la tabla de INFORMACIÓN para identificar de forma única una fila, necesita t1ID y T2id

 1
Author: sactiw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-05 13:45:03