Pergunta

EDIT: I parecem para obter o erro listado abaixo em cada inserção não importa o que os dados tento inserir. Então, talvez a minha mesa foi corrompido ou algo assim? De qualquer forma, aqui está a minha pergunta:

Eu tenho uma tabela 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

E tem cerca de meio milhão de linhas. Estou tentando executar uma simples INSERIR

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');

e dá-me o erro

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

o que implica que eu estou violando minha restrição UNIQUE sobre os três campos ndss_id, acp_id e run_date. (O ID de 502.831 não é uma linha na minha mesa e parece ser o próximo id que seria usado se a linha tinha sido inserido.) O problema é que, se eu selecionar contra esses campos com os mesmos valores

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

então ele não retornou resultados. Então eu não estou realmente duplicar nada. Minhas outras chaves estão todos a poucos índices e restrições não exclusivas; Eu também tenho a uma restrição UNIQUE, como você pode ver no meu instrução CREATE TABLE. Então por que é me dizendo que eu tenho uma duplicata?

Foi útil?

Solução 2

Aparentemente, a tabela foi corrompido. Corri CHECK TABLE e vi alguns erros de corrupção e, em seguida, correu REPAIR TABLE e pareceu-obra; depois meus INSERTS começou a trabalhar novamente.

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)

Outras dicas

Seria possível os seus números de seqüência estão fora em relação a auto_increment na id? Tente configurar a tecla superior e repetir a inserção.

ALTER TABLE AcpConfig AUTO_INCREMENT = 1;

Aparentemente, isso irá repor o próximo auto_increment para ser o próximo valor mais alto disponível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top