2011-02-04 4 views
5

私は 'created_at'によってパーティション化され、主キーが(idcreated_at)であるテーブルfooを持っています。私:パーティション化されたMySQL DB内のフィールドにユニークなインデックスを追加するにはどうすればよいですか?

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

bar_idがすべてのパーティションで一意であるように一意のインデックスを作成するにはどうすればよいですか。私はのような何かしようとした場合:

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

を私はエラーが表示さ:

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

をしかし、インデックスを構築するとき、私はパーティショニング機能(idcreated_at)が含まれている場合、私はそのインデックスで終わりますbar_idが一意であることを保証するものではありません。

UPDATE

私はすでにテーブルの主キーを持っていることを言及しておく必要があります。

PRIMARY KEY (`id`,`created_at`) 

また、bar_idはNULLにすることができます。

+2

ねえ、方法を見つけましたか?私はまったく同じ問題で苦労しています。パーティションキーがユニークキーの一部でなければならない理由は分かりません。それを理解できない。 – varunl

+0

@varunl、私も同じ問題があります。パーティションキーとして 'start datatime'フィールドを使用する必要があります。私は' id'をプライマリキーとして作成していますが、本当にユニークである必要があるUNIQUE KEYとして他のフィールドを持っています。 – shgnInc

答えて

0

主キーを作成します。

パーティション化の場合:パーティション化式に使用される列は、表の主キー(ある場合)または(最初の)一意キー(一意キーはないが主キーはない場合)の一部である必要があります。そうしないと、「プライマリ・キーはすべてのフィールドをパーティション・ファンクションに組み込む必要があります」というエラー・メッセージが表示されます。

表に主キーがなく、1つ以上の一意キーがある場合は、パーティション式で使用される列は(最初の)固有キーの一部でなければなりません。

+0

私はすでにPRIMARY KEY( 'id'、' created_at')というテーブルにプライマリキーを持っていると述べました。また、bar_idはNULLでもかまいません。 –

0

これは、一意のbar_idと挿入前トリガーを格納するセカンダリテーブルを介して実行できます。

+0

これは興味深いアプローチです。残念ながら、これは、bar_idがNULLに更新されるか、またはfooの指定された行に対して変更された場合を処理するルーチン(またはそれ以上)を記述する必要があることを意味します。オーバーヘッドのように思えますが、よりシンプルなソリューションが必要であると私は信じています。 –

2

エラーメッセージ自体に問題が説明されています。 http://dev.mysql.com/doc/refman/5.5/en/partitioning-limitations-partitioning-keys-unique-keys.html "ルールは次のとおりです。パーティション化された表のパーティション化式で使用されるすべての列は、表が持つすべての固有キーの一部でなければなりません。テーブルは、テーブルのパーティショニング式のすべてのカラムを使用する必要があります。

+2

貼り付けられたURLが切り捨てられているようです。 – Dughall

+0

メモをありがとう、私は彼らがここに移動したと思いますhttp://dev.mysql.com/doc/refman/5.5/en/partitioning-limitations-partitioning-keys-unique-keys。html 私は私の答えでリンクを更新しました。 – azzaxp

関連する問題