Tengo una mesa llamada provider
. Tengo tres columnas llamadas person
, place
, thing
. Puede haber personas duplicadas, lugares duplicados y cosas duplicadas, pero nunca puede haber una combinación duplicada de persona-lugar-cosa.
¿Cómo ALTERARÍA TABLA para agregar una clave primaria compuesta para esta tabla en MySQL con estas tres columnas?
La respuesta de @Adrian Cornish es correcta. Sin embargo, hay otra advertencia para descartar una clave primaria existente. Si esa tabla principal está siendo utilizada como clave externa por otra tabla, obtendrá un error al intentar soltarla. En algunas versiones de mysql, el mensaje de error estaba mal formado (a partir de 5.5.17, este mensaje de error sigue siendo
Si desea eliminar una clave principal a la que hace referencia otra tabla, primero deberá eliminar la clave externa en esa otra tabla. Puede volver a crear esa clave externa si aún la desea después de volver a crear la clave primaria.
Además, cuando se usan claves compuestas, el orden es importante. Estas
No son lo mismo. Ambos imponen la unicidad en ese conjunto de tres campos, sin embargo, desde un punto de vista de indexación, hay una diferencia. Los campos están indexados de izquierda a derecha. Por ejemplo, considere las siguientes consultas:
B puede usar el índice de clave primaria en la declaración ALTER 1
A puede usar el índice de clave primaria en la declaración ALTER 2
C puede usar cualquiera de los índices
D no puede usar ninguno de los índices
A usa los dos primeros campos en el índice 2 como índice parcial. A no puede usar el índice 1 porque no conoce la porción del lugar intermedio del índice. Sin embargo, aún podría ser capaz de usar un índice parcial en una sola persona.
D no puede usar ninguno de los índices porque no conoce a la persona.
Vea los documentos de mysql aquí para más información.
fuente
Es posible que simplemente desee una RESTRICCIÓN ÚNICA. Especialmente si ya tienes una clave sustituta. (ejemplo de una clave sustituta ya existente sería una sola columna que es un AUTO_INCREMENTO)
A continuación se muestra el código sql para una restricción única
fuente
fuente
Definitivamente es mejor usar COMPOSITE UNIQUE KEY, como lo ofreció @GranadaCoder, un ejemplo un poco complicado:
ALTER IGNORE TABLE table_name ADD UNIQUES INDEX idx_name(some_id, another_id, one_more_id);
fuente
ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);
fuente