2011-02-04 6 views
5

Ho una tabella, foo, che è partizionata da 'created_at' e ha la sua chiave primaria come (id, created_at). Cioè .:Come si aggiunge un indice univoco su un campo in un DB MySQL partizionato?

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, 
... 
) 

Come si crea un indice univoco tale che bar_id è univoco in tutte le partizioni? Se provo qualcosa di simile:

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

ricevo l'errore:

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

Ma, se comprendo la funzione di partizionamento (id, created_at) quando si costruisce l'indice poi io alla fine con un indice che non garantisce che bar_id sia unico.

UPDATE

Avrei detto che ho già una chiave primaria nella tabella:

PRIMARY KEY (`id`,`created_at`) 

Inoltre, bar_id può essere NULL.

+2

Ehi, hai trovato un modo? Sto lottando con lo stesso identico problema. Non capisco nemmeno perché la chiave di partizione debba far parte delle chiavi univoche. Non può dare un senso a questo. – varunl

+0

@varunl, ho lo stesso problema anche io. Ho bisogno di usare il campo 'start datatime' come chiave di partizione e lo faccio con' id' archiviato come chiave primaria, ma ho altri campi come UNQUE KEY che devono essere veramente unici. – shgnInc

risposta

0

Creare una chiave primaria.

Da MySQL docs su partizionamento: qualsiasi colonna utilizzata per un'espressione di partizionamento deve essere parte della chiave primaria della tabella (se ne ha una) o (prima) chiave univoca (se ha una chiave univoca ma nessuna chiave primaria). In caso contrario, verrà visualizzato il messaggio di errore "Una CHIAVE PRIMARIA deve includere tutti i campi nella funzione di partizione".

Se una tabella non ha una chiave primaria, ma ha una o più chiavi univoche, qualsiasi colonna utilizzata nell'espressione di partizionamento deve far parte della (prima) chiave univoca.

+0

Avrei dovuto dire che ho già una chiave primaria sulla tabella: PRIMARY KEY ('id',' created_at'). Inoltre, bar_id può essere NULL. –

0

Questo può essere fatto tramite una tabella secondaria per memorizzare l'univoco bar_id e un trigger prima dell'inserimento.

+0

Questo è un approccio interessante. Sfortunatamente, questo significa che dovrei scrivere una routine (o più) per gestire i casi in cui bar_id è aggiornato a NULL o modificato per una data riga in foo, corretto? Sembra un carico eccessivo, il che mi porta a pensare che ci debba essere una soluzione più semplice. –

2

Il messaggio di errore spiega il problema. Si prega di leggere il manuale, http://dev.mysql.com/doc/refman/5.5/en/partitioning-limitations-partitioning-keys-unique-keys.html

"La regola è:. Tutte le colonne utilizzate nell'espressione di partizionamento per una tabella partizionata devono essere parte di ogni chiave univoca che la tabella può avere In parole semplici, ogni chiave univoca sulla la tabella deve utilizzare ogni colonna nell'espressione di partizionamento della tabella. "

+2

Sembra che l'URL incollato sia stato troncato. – Dughall

+0

Grazie per la nota, credo che l'abbiano spostato qui http://dev.mysql.com/doc/refman/5.5/en/partitioning-limitations-partitioning-keys-unique-keys.html Ho aggiornato il collegamento nella mia risposta. – azzaxp