Estou inserindo na tabela a seguir usando LuaSQL com API PtokaX.
CREATE TABLE `requests` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`ctg` VARCHAR(15) NOT NULL,
`msg` VARCHAR(250) NOT NULL,
`nick` VARCHAR(32) NOT NULL,
`filled` ENUM('Y','N') NOT NULL DEFAULT 'N',
`dated` DATETIME NOT NULL,
`filldate` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `nick_msg` (`nick`, `msg`),
UNIQUE INDEX `ctg_msg` (`ctg`, `msg`)
)
COMMENT='Requests from users in any of the categories.'
COLLATE='utf8_general_ci'
ENGINE=MyISAM;
Agora, meu problema é que, quando um usuário (representado por nick
) tenta inserir a mesma solicitação novamente, o UNIQUE
índice é verificado e o script retorna um false. Isso faz com que meu script falhe e eu tenha que reiniciar o script.
Existe algo que eu possa fazer no
INSERT ... ON DUPLICATE KEY
comando para que ele não faça nada ou pelo menos NÃO retorne um erro em caso deDUPLICATE KEY
?
Caso contrário, eu teria que atualizar meu dated
campo com o novo DATETIME
valor.
Três caminhos. Erros
IGNORE
duplicados (mas não use isso, veja a nota no final):ou tente fazer uma atualização redundante quando houver uma duplicata:
ou verifique se há duplicatas antes de inserir:
Uma diferença entre a 3ª via e as duas primeiras é que quando houver duplicatas, a
id
não será incrementada. ComINSERT IGNORE
eINSERT ... ON DUPLICATE KEY
, ele será incrementado automaticamente e como a inserção não será feita, você terá lacunas nos valores deid
.Também devo acrescentar que seus scripts devem sempre verificar erros de qualquer maneira e não falhar quando houver um. Qualquer consulta ou instrução pode falhar e retornar erro ocasionalmente, por vários motivos. Os truques acima só o salvarão de um tipo de erro.
*Observação:
INSERT IGNORE
ignorará todos os erros relacionados à inserção , mesmo não violações de restrição nula, portanto, é melhor evitá-lo.As opções são ótimas, só conheço uma quarta. Você pode criar um procedimento como o seguinte (MySQL 5.5 ou superior).