
O que aconteceu foi o seguinte, a PK foi configurada como SMALLINT, o que permite até 2 bytes ou 2^16 quando UNSIGNED (só valores positivos), em outras palavras até 65.535 registros (o zero entra no jogo também). Após o aviso de que uma determinada feature não funcionava, o TSHOOT inicial não deixou dúvidas, não era possível inserir mais registros pois a PK tinha atingido o valor máximo.
Estratégia adotada com tipo de dado INT:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- 1 - Criar/copiar tabela problemática:
CREATE TABLE TABELA_NOVA SELECT * FROM TABELA_PRODUCAO;
-- 2 - Obter último valor da PK, nosso caso 65535
SELECT PK_ABUDEGA FROM TABELA_PRODUCAO ORDER BY PK_ABUDEGA DESC;
-- 3 - Adicionar constraints necessárias e obviamente da PK também
ALTER TABLE TABELA_NOVA ADD PRIMARY KEY (PK_ABUDEGA);
ALTER TABLE TABELA_NOVA CHANGE PK_ABUDEGA PK_AJUSTADA INT(11) UNSIGNED NOT NULL AUTO_INCREMENT;
ALTER TABLE TABELA_NOVA ADD FOREIGN KEY (TABELA_RELACIONADA_ID) REFERENCES TABELA_RELACIONADA(ID);
-- 4 - O valor do passo 3 mais 1
ALTER TABLE TABELA_NOVA AUTO_INCREMENT = 65536;
-- 5 - Renomear tabela problemática para qualquer outra coisa
RENAME TABLE TABELA_PRODUCAO TO TABELA_PRODUCAO_OLD;
RENAME TABLE TABELA_NOVA TO TABELA_PRODUCAO;
Calma que isso só resolve o lado do banco de dados, e se de repente no lado da aplicação a classe mapeada tiver o atributo da PK com short em vez de integer? Nada é tão ruim que não possa ficar pior. Dia de aventuras, novos conhecimentos, desafios nefastos e lições aprendidas.Ao som de Joe Satriani - Made of Tears.
Comentários
Postar um comentário