MySQL的:错误在表1022复制的钥匙

问题描述:

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' 

插入statment“不”包括用于ID(NOT NULL AUTO_INCREMENT)和t_stamp值(NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)。

我在各种论坛上阅读帖子,但无法得到问题的根本原因。

这将是巨大的帮助,如果有一个人能指导我解决问题

+1

对我来说,看起来不错,如果你的查询不包含id(就像你说的那样)它应该总是唯一的。你是否在两台机器上使用写入来运行复制? –

+0

感谢您的回复。对不起,我没有得到你的问题。 FYI表中,我得到这个错误得到复制到备份系统 – dvs

它看起来像你想设置一个以上的PRIMARY KEY

PRIMARY KEY (id,f_date) 

只能有一个主键并且你已经将f_date设置为KEY,所以只需擦除,f_date,你应该没问题。

+1

嗯,没有... KEY和PRIMARY KEY之间有区别。这里只有一个主键。 –

+0

感谢您的回复。根据mysql,f_date需要成为PRIMARY KEY的一部分“分区表的分区表达式中使用的所有列必须是该表可能具有的每个唯一键的一部分”。来源:http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-partitioning-keys-unique-keys.html – dvs

你可以像下面这样;不要单独声明'f_date'作为密钥

PRIMARY KEY (`id`,`f_date`), 
    KEY `d_id` (`d_id`), 
    KEY `p_id` (`p_id`), 
    KEY `i_id` (`i_id`), 
    KEY `s_id` (`s_id`), 
    KEY `t_id` (`t_id`), 
    KEY `as_id` (`as_id`) 
+0

感谢您的回复。 'f_date'作为关键字需要在'f_date'上为基于f_date选择数据的查询设置索引。 PRIMARY KEY中需要'f_date',因为分区基于'f_date' – dvs