2011-11-30 17 views
2
CREATE TABLE `d_s_rep` ( 
`id` bigint(20) NOT NULL AUTO_INCREMENT, 
`p_id` bigint(20) NOT NULL, 
`i_id` bigint(20) NOT NULL, 
`d_id` bigint(20) NOT NULL, 
`s_id` bigint(20) NOT NULL, 
`t_id` bigint(20) NOT NULL DEFAULT '0', 
`as_id` bigint(20) NOT NULL, 
`ccount` bigint(20) DEFAULT '0', 
`dcount` bigint(20) NOT NULL DEFAULT '0', 
`icount` bigint(20) DEFAULT '0', 
`di` bigint(20) NOT NULL DEFAULT '0', 
`dhi` bigint(20) NOT NULL DEFAULT '0', 
`r` decimal(25,8) DEFAULT '0.00000000', 
`f_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
`t_date` datetime DEFAULT NULL, 
`t_stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
PRIMARY KEY (`id`,`f_date`), 
KEY `d_id` (`d_id`), 
KEY `p_id` (`p_id`), 
KEY `f_date` (`f_date`), 
KEY `i_id` (`i_id`), 
KEY `s_id` (`s_id`), 
KEY `t_id` (`t_id`), 
KEY `as_id` (`as_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=11064336 DEFAULT CHARSET=latin1 /*!50100 PARTITION BY RANGE (TO_DAYS(f_date)) (PARTITION p2009OLD VALUES LESS THAN (733863) ENGINE = InnoDB, PARTITION p2009Q2 VALUES LESS THAN (733954) ENGINE = InnoDB, PARTITION p2009Q3 VALUES LESS THAN (734046) ENGINE = InnoDB, PARTITION p2009Q4 VALUES LESS THAN (734138) ENGINE = InnoDB, PARTITION p2010Q1 VALUES LESS THAN (734228) ENGINE = InnoDB, PARTITION p2010Q2 VALUES LESS THAN (734319) ENGINE = InnoDB, PARTITION p2010Q3 VALUES LESS THAN (734411) ENGINE = InnoDB, PARTITION p2010M10 VALUES LESS THAN (734442) ENGINE = InnoDB, PARTITION p2010M11 VALUES LESS THAN (734472) ENGINE = InnoDB, PARTITION p2010M12 VALUES LESS THAN (734503) ENGINE = InnoDB, PARTITION p2011M01 VALUES LESS THAN (734534) ENGINE = InnoDB, PARTITION p2011M02 VALUES LESS THAN (734562) ENGINE = InnoDB, PARTITION p2011M03 VALUES LESS THAN (734593) ENGINE = InnoDB, PARTITION p2011M04 VALUES LESS THAN (734623) ENGINE = InnoDB, PARTITION p2011M05 VALUES LESS THAN (734654) ENGINE = InnoDB, PARTITION p2011M06 VALUES LESS THAN (734684) ENGINE = InnoDB, PARTITION p2011M07 VALUES LESS THAN (734715) ENGINE = InnoDB, PARTITION p2011M08 VALUES LESS THAN (734746) ENGINE = InnoDB, PARTITION p2011M09 VALUES LESS THAN (734776) ENGINE = InnoDB, PARTITION p2011M10 VALUES LESS THAN (734807) ENGINE = InnoDB, PARTITION p2011M11 VALUES LESS THAN (734837) ENGINE = InnoDB, PARTITION p2011M12 VALUES LESS THAN (735173) ENGINE = InnoDB) 

上記の表で、いくつかの挿入は、コードに挿入クエリをfronmはエラーで失敗のMySQL:エラー1022テーブルに重複キー

Total Number of diagnostic records: 1 
SQLSTATE: 23000 
Native Error Code: 1022 
[MySQL][ODBC 3.51 Driver][mysqld-5.1.30-community-log]Can't write; duplicate key in table 'd_s_rep' 

インサートなステートメントは、IDの値(NOT NULL AUTO_INCREMENT)とt_stampを含む「しません」 (NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)。

さまざまなフォーラムで投稿を読みましたが、問題のルートケースを取得できませんでした。

いくつかのいずれかが問題

+1

クエリにidが含まれていない場合は、常に一意でなければなりません。両方のマシンで書き込みを伴うレプリケーションを実行していますか? –

+0

お返事ありがとうございます。申し訳ありませんがあなたの質問を得ていません。 FYIこのエラーが発生しているテーブルはバックアップシステムに複製されます – dvs

答えて

3

を解決するために私を導くことができれば、それはあなたが複数のPRIMARY KEY

PRIMARY KEY (id,f_date) 

を設定しようとしているようにあなたが唯一のPRIMARY KEYを持つことができますに見える大きな助けになりますすでにf_dateをKEYに設定しているので、、f_dateを消去しても問題ありません。

+1

うーん、いいえ... KEYとPRIMARY KEYの間に違いがあります。ここにはPRIMARY KEYが1つしかありません。返信ありがとうございます。 –

+0

f_dateは、mysqlのようにPRIMARY KEYの一部である必要があります。「分割されたテーブルの分割式で使用されるすべてのカラムは、テーブルが持つ可能性のあるすべてのユニークキーの一部でなければなりません。出典:http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-partitioning-keys-unique-keys.html – dvs

0

以下のように設定できます。別にキーとして 'f_date'を宣言しないでください

+0

返信ありがとうございます。 f_dateに基づいてデータを選択するクエリでは、 'f_date'をキーとしてインデックスを 'f_date'にする必要があります。パーティション化は 'f_date'に基づいているため、PRIMARY KEYに 'f_date'が必要です – dvs

関連する問題