2009-07-23 5 views
2

편집 : 삽입하려고하는 데이터가 무엇이든 관계없이 모든 삽입물에 아래 오류가 표시되는 것 같습니다. 어쩌면 내 식탁이 부패 했나? 어쨌든, 여기 내 질문 :중복이 없을 때 MySQL에 중복 입력 오류가 발생했습니다.

나는 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 

을 그리고 약 50 만 행을 가지고있다. 나는 간단한 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'); 

을 수행하기 위해 노력하고있어 그것은 나에게 acp_id 및 run_date, ndss_id 나는 세 개의 필드 내 UNIQUE 제약 조건을 위반하고있어 것을 의미 오류

ERROR 1062 (23000): Duplicate entry '502831' for key 1 

을 제공합니다. (ID입니다 502831 내 테이블의 행하지 않고 행이 삽입 된 경우 사용되는 다음 ID를 것 같다.) 나는 같은 값을 해당 필드에 대해 선택하면 문제가있다

select * from AcpConfig where ndss_id=75 and acp_id=5 and run_date='2009-07-22'; 

결과를 반환하지 않습니다. 그래서 저는 실제로 어떤 것도 복제하지 않습니다. 내 다른 키는 모두 인덱스이며 고유 제한 조건이 아닙니다. 또한 CREATE TABLE 문에서 볼 수있는 것과 같이 UNIQUE 제약 조건이 하나 있습니다. 그렇다면 왜 내가 복제본을 가지고 있다고 말하는거야?

답변

2

분명히 테이블이 손상되었습니다. 내가 CHECK TABLE을 달렸고 약간의 부패 에러를보고 나서 REPAIR TABLE을 돌렸다. 이후에 INSERTS가 다시 일하기 시작했습니다.

mysql> check table AcpConfig; 
+---------------+-------+----------+----------------------------------------------------------+ 
| Table   | Op | Msg_type | Msg_text             | 
+---------------+-------+----------+----------------------------------------------------------+ 
| acp.AcpConfig | check | warning | 8 clients are using or havent closed the table properly | 
| acp.AcpConfig | check | warning | Size of datafile is: 32079848  Should be: 32079784 | 
| acp.AcpConfig | check | error | Found 495762 keys of 495761        | 
| acp.AcpConfig | check | error | Corrupt             | 
+---------------+-------+----------+----------------------------------------------------------+ 
4 rows in set (3.50 sec) 

mysql> repair table AcpConfig; 
+---------------+--------+----------+----------------------------------------------+ 
| Table   | Op  | Msg_type | Msg_text          | 
+---------------+--------+----------+----------------------------------------------+ 
| acp.AcpConfig | repair | warning | Number of rows changed from 495761 to 495762 | 
| acp.AcpConfig | repair | status | OK           | 
+---------------+--------+----------+----------------------------------------------+ 
2 rows in set (13.14 sec) 
+1

REPAIR TABLE에서 일련 번호를 수정 한 것 같습니다. – northpole

3

id의 auto_increment와 관련하여 시퀀스 번호가 해제 될 수 있습니까? 키를 높게 설정하고 삽입을 다시 시도하십시오.

ALTER TABLE AcpConfig AUTO_INCREMENT = 1; 

분명히 다음 auto_increment가 사용 가능한 다음 값으로 재설정됩니다.

+0

굉장한 제안; 이 정확한 작업을 수행하는 방법을 궁금해 했으므로 좋은 참고 자료입니다. 그러나, 내가 말한 것처럼 아래의 답은 TABLE 문에 의해 수정 된 문제로 판명 되었기 때문에 이것이 스스로 해결할 수 있을지 확신 할 수 없다. 어쨌든 고마워. –