2011-02-04 20 views
5

Tengo una tabla, foo, que está particionada por 'created_at' y tiene su clave principal como (id, created_at). Es decir .:¿Cómo agrego un índice único en un campo en una base de datos MySQL particionada?

CREATE TABLE `foo` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `created_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `bar_id` int(11) DEFAULT NULL, 
    ... 

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 
/*!50100 PARTITION BY RANGE (TO_DAYS(created_at)) 
(PARTITION p0 VALUES LESS THAN (733712) ENGINE = InnoDB, 
PARTITION p1 VALUES LESS THAN (733773) ENGINE = InnoDB, 
PARTITION p2 VALUES LESS THAN (733832) ENGINE = InnoDB, 
PARTITION p3 VALUES LESS THAN (733893) ENGINE = InnoDB, 
... 
) 

¿Cómo se crea un índice único de tal manera que bar_id es único entre todas las particiones? Si intento algo como:

CREATE UNIQUE INDEX some_index USING BTREE ON foo (bar_id); 

recibo el error:

ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function 

Pero, si incluyo la función de partición (id, created_at) cuando se construye el índice y luego termino con un índice que no garantiza que bar_id sea único.

ACTUALIZACIÓN

debería haber mencionado que ya tengo una clave principal en la tabla:

PRIMARY KEY (`id`,`created_at`) 

Además, bar_id puede ser NULL.

+2

Oye, ¿has encontrado una manera? Estoy luchando con el mismo problema. Ni siquiera entiendo por qué la clave de partición debe ser parte de las claves únicas. No puedo entenderlo. – varunl

+0

@varunl, tengo el mismo problema también. Necesito usar el campo 'start datatime' como clave de partición y lo hago con el' id' archivado como clave principal, pero tengo otros campos como UNIQUE KEY que realmente deben ser únicos. – shgnInc

Respuesta

0

Crear una clave principal.

desde el MySQL docs en el particionamiento: cualquier columna utilizada para una expresión de partición debe ser parte de la clave principal de la tabla (si tiene una) o (primera) clave única (si tiene una clave única pero no primaria). De lo contrario, verá el mensaje de error "Una LLAVE PRINCIPAL debe incluir todos los campos en la función de partición".

Si una tabla no tiene una clave principal, pero tiene una o más claves exclusivas, todas las columnas utilizadas en la expresión de partición deben ser parte de la (primera) clave única.

+0

Debería haber mencionado que ya tengo una clave principal en la tabla: PRIMARY KEY ('id',' created_at'). Además, bar_id puede ser NULL. –

0

Esto se puede hacer a través de una tabla secundaria para almacenar el único bar_id y un activador de inserción anterior.

+0

Ese es un enfoque interesante. Desafortunadamente, esto significa que necesitaría escribir una rutina (o más) para manejar casos donde bar_id se actualiza a NULL o se cambia para una fila dada en foo, ¿correcto? Parece que hay muchos gastos generales, lo que me lleva a pensar que debe haber una solución más simple. –

2

El mensaje de error en sí explica el problema. Por favor, lea el manual, http://dev.mysql.com/doc/refman/5.5/en/partitioning-limitations-partitioning-keys-unique-keys.html

"La regla es:. Todas las columnas utilizadas en la expresión de particionamiento de una tabla con particiones deben ser parte de cada clave única que la mesa puede tener En palabras sencillas, cada clave única en el la tabla debe usar cada columna en la expresión de partición de la tabla ".

+2

Parece que la URL pegada se ha truncado. – Dughall

+0

Gracias por la nota, supongo que la cambiaron aquí http://dev.mysql.com/doc/refman/5.5/en/partitioning-limitations-partitioning-keys-unique-keys.html He actualizado el enlace en mi respuesta. – azzaxp

Cuestiones relacionadas