Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa noite!
Estou a algum tempo tentando resolver um problema que estou tentando ao tentar excluir registros com o PDO e não consigo solucioná-lo.
Tenho 3 tabelas
produto - dados do produto
cor - dados da cor
corproduto - vínculo da tabela produto e cor
Acontece que, quando vou alterar um produto, em minhas classes, eu excluo todos os registros referente ao produto em questão da tabela corproduto. E vinculo as novas cores do produto. A tabela corproduto tem chave única (1produto:1cor). Porém, quando executo o programa, ele me acusa que estou restringindo a chave única.
SQLSTATE[23505]: Unique violation: 7 ERROR: duplicate key value violates unique constraint "corproduto_cor_produto_in"
DETAIL: Key (id_cor, id_produto)=(1, 19) already exists.
Comentei o trecho do código onde eu salvo as novas cores e tentei salvar, o produto. Dessa forma ele exclui o vínculo normalmente e salva os dados do produto sem nenhum problema.
Segue abaixo o meu código e tabela:
/**
* Exclui os dados da tabela de acordo com a cláusula where fornecida.
* @param string $sClausulaWhere
* @throws Exception
* @return boolean
*/
public function excluir($sClausulaWhere = null) {
if (empty($sClausulaWhere)) {
throw new Exception("Nenhuma cláusula WHERE foi informada.");
}
$oBanco = Banco::getInstance(); $sSqlDelete = "delete from {$this->getNomeTabela()} where {$sClausulaWhere};";
$rsDelete = $oBanco->exec($sSqlDelete);
} catch (PDOException $ePDOException) {
throw new Exception($ePDOException->getMessage());
}
return true;
}
felinisoftware=# \d corproduto
Table "public.corproduto"
Column | Type | Modifiers
------------+---------+-----------
id_cor | integer | not null
id_produto | integer | not null
Indexes:
"corproduto_cor_produto_in" UNIQUE, btree (id_cor, id_produto)
Foreign-key constraints:
"corproduto_id_cor_fkey" FOREIGN KEY (id_cor) REFERENCES cor(id_cor)
"corproduto_id_produto_fkey" FOREIGN KEY (id_produto) REFERENCES produto(id_produto)
Toda ajuda é bem vinda.
Obrigado.
Opa!
Depois que li o post do Bruno, vi que havia falado besteira. Na verdade tenho um produto que podem ter diversas cores, com o índice único vou garantir que um produto não tenha duas vezes a cor azul, por exemplo.
Acontece, que meu PDO, parece não excluir o vínculo antes de salvar os novos vínculos com as novas cores.
Digamos que:
Meu programa executa com o PDO a exclusão de todos os registros que possuem o id_produto e tenta inserir denovo logo após a exclusão dos vínculos, e é aí que estoura o erro.
Eu acho complicado trabalhar com UNIQUE e a PDO, sou muito poucas as informações sobre como lidar com o caso.
E se você remover o UNIQUE e permitir a inserção duplicada e, na hora de consultar, usar um DISTINCT?
Opa!
Havia esquecido desse post. Enfim, resolvi o problema. Era meu código javascript/ajax que estava enviando informações duplicadas e eu não tinha me dado conta.
Pode dá-lo como encerrado. :)
O problema parece estar com essa Cláusula UNIQUE que você definiu na tabela corprodutos pois, ao meu ver, essa é uma relação N:N onde podem haver infinitas ocorrências com o mesmo valor. E se podem haver infinitas ocorrências, ela logicamente não pode ser única.
Não sou o mais experiente no assunto, mas pode ser isso que esteja ocorrendo. :thumbsup: