2010-04-15 14 views
18

Estoy tratando de aprender a usar las teclas y romper el hábito de tener necesariamente identificaciones de tipo SERIAL para todas las filas en todas mis tablas. Al mismo tiempo, también estoy haciendo relaciones de muchos a muchos, por lo que requerir valores únicos en cualquiera de las columnas de las tablas que coordinen las relaciones obstaculizaría eso.Clave principal de múltiples columnas en MySQL 5

¿Cómo puedo definir una clave principal en una tabla de modo que cualquier valor dado pueda repetirse en cualquier columna, siempre que la combinación de valores en todas las columnas nunca se repita exactamente?

+0

Posible duplicado de [Cómo crear correctamente las claves primarias compuestas - MYSQL] (http://stackoverflow.com/questions/5835978/how-to-properly-create-composite-primary-keys-mysql) –

+0

No se puede ser un duplicado de algo publicado 3 años después. – Kaji

+0

http://meta.stackexchange.com/questions/147643/should-i-vote-to-close-a-duplicate-question-even-though-though-its-much-newer-and-ha ;-) –

Respuesta

39

citado de la página CREATE TABLE Syntax:

una clave principal puede ser un índice de múltiples columnas . Sin embargo, no puede crear un índice de columnas múltiples con el atributo de clave PRIMARY KEY en una especificación de columna . Hacerlo solo marca esa columna individual como primaria. Usted debe usar una CLAVE PRINCIPAL PRIMARIA (index_col_name, ...) cláusula.

Algo como esto puede ser utilizado para las claves principales de varias columnas:

CREATE TABLE 
    product (
     category INT NOT NULL, 
     id INT NOT NULL, 
     price DECIMAL, 
     PRIMARY KEY(category, id) 
    ); 

De 13.6.4.4. FOREIGN KEY Constraints

+0

Shouldn ' t ¿Incluye el precio en el PK (categoría, identificación, precio) de su ejemplo? ¿Está pidiendo 'cualquier columna' y 'a través de todas las columnas'? ... y luego agregar un severo comentario acerca de que esto es subóptimo, lento y nunca se necesita en la vida real? (SÍ! ESTOY criticando aquí :-) – lexu

+0

Estoy de acuerdo. Todas las columnas deben estar allí – fiacobelli

+0

No funciona en absoluto en mi caso. Por ejemplo, si uso una categoría diferente, pero la misma identificación, aún así, muéstreme la clave duplicada. –

17

clave primaria es un concepto de dominio que de forma única (necesaria y suficiente) identifica a su entidad entre entidades similares. Una clave primaria compuesta (múltiples columnas) tiene sentido solo cuando una parte de la clave se refiere a una instancia particular de otra entidad de dominio.

Digamos que tiene una colección personal de libros. Mientras esté solo, puede contarlos y asignarle un número a cada uno. El número es la clave principal del dominio de su biblioteca.

Ahora desea fusionar su biblioteca con la de su vecino pero aún así poder distinguir a quién pertenece un libro. El dominio ahora es más amplio y la clave primaria es ahora (propietario, book_id).

Por lo tanto, hacer que cada compuesto de clave principal no sea su estrategia, sino que debe usarlo cuando sea necesario.

Ahora algunos datos sobre MySQL. Si define una clave primaria compuesta y desea que RDBSM aumente automáticamente los identificadores, debe conocer la diferencia entre MyISAM y el comportamiento de InnoDB.

Digamos que queremos una tabla con dos campos: parent_id, child_id. Y queremos que child_id sea autoincrementado.

MyISAM se autoincrementará de forma única dentro de los registros con el mismo parent_id e InnoDB se autoincrecerá de manera única dentro de la tabla completa.

En MyISAM debe definir la clave principal como (parent_id, child_id), y en InnoDB como (child_id, parent_id), porque el campo autoincremented debe ser el componente más a la izquierda en la clave principal en InnoDB.

+1

Esta es una respuesta excelente. – Dakatine

1

La clave principal es un valor único para la fila. No tiene sentido incluir el precio, un valor que podría cambiar. Imagínese si tuviera que cambiar un amplio rango de precios, entonces cambiarían todos los valores de clave primaria. ¡Qué desastre sería!

Cuestiones relacionadas