编辑:无论我尝试插入什么数据,我似乎在每次插入时都会收到下面列出的错误。所以也许我的桌子坏了还是什么?无论如何,这是我的问题:
我有一个 MySQL 表
CREATE TABLE `AcpConfig` (
`ndss_id` int(11) NOT NULL default '0',
`acp_id` int(11) NOT NULL default '0',
`run_date` date NOT NULL default '0000-00-00',
`hw_5_threshold` tinyint(1) NOT NULL default '0',
`stp_on` tinyint(1) NOT NULL default '0',
`sort_on` tinyint(1) NOT NULL default '0',
`afcs_ocr_message_format` tinyint(1) NOT NULL default '0',
`use_hw` tinyint(1) NOT NULL default '0',
`test_mode` tinyint(1) NOT NULL default '0',
`afcs_version` varchar(255) NOT NULL default '',
`acp_build` varchar(255) NOT NULL default '',
`id` int(11) NOT NULL auto_increment,
`swstp_in_acp_rack` int(11) NOT NULL default '0',
`acplookup_id` int(11) NOT NULL default '0',
`bfind_cksum` varchar(255) NOT NULL default '',
`tz_cksum` varchar(255) NOT NULL default '',
`fetched` varchar(4) NOT NULL default '"NO"',
PRIMARY KEY (`id`),
UNIQUE KEY `ndss_id` (`ndss_id`,`acp_id`,`run_date`),
KEY `ndss_acp` (`ndss_id`,`acp_id`),
KEY `ndss_acp_rundate` (`ndss_id`,`acp_id`,`run_date`),
KEY `run_date` (`run_date`),
KEY `acplookup_rundate` (`acplookup_id`,`run_date`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
它有大约一百万行。我正在尝试执行一个简单的 INSERT
INSERT INTO AcpConfig (ndss_id, acp_id, run_date, hw_5_threshold, stp_on, sort_on, afcs_ocr_message_format, use_hw, test_mode, afcs_version, acp_build, swstp_in_acp_rack, acplookup_id, bfind_cksum, tz_cksum) VALUES ('75', '5', '2009-07-22', '75', '1', '1', '0', '1', '0', '1.5.2', '041709', '2', '269', '0', '1950359846');
它给了我错误
ERROR 1062 (23000): Duplicate entry '502831' for key 1
这意味着我违反了对三个字段 ndss_id、acp_id 和 run_date 的 UNIQUE 约束。(id 502831 不是我表中的一行,如果已插入该行,它似乎是下一个将使用的 id。)问题是,如果我对具有相同值的那些字段进行 SELECT
select * from AcpConfig where ndss_id=75 and acp_id=5 and run_date='2009-07-22';
然后它不返回任何结果。所以我实际上并没有复制任何东西。我的其他键都只是索引而不是唯一约束;从我的 CREATE TABLE 语句中可以看出,我还有一个 UNIQUE 约束。那么为什么它告诉我我有一个副本?