Jump to content


Photo

Warning: Pg_query(): Query Failed: Error: Duplicate Key Violates Uniqu


  • Faça o login para participar
11 replies to this topic

#1 le_sampaPHP

le_sampaPHP

    Novato no fórum

  • Usuários
  • 11 posts
  • Sexo:Não informado
  • Localidade:São Paulo - SP
  • Interesses:PHP - Postgre - MySQL - Ajax

Posted 11/12/2006, 08:13

Olá pessoal,

Aqui na empresa temos uma intranet, mas não fui eu quem fez e também sou novato nessa área de PHP, ainda estou aprendendo, deu um erro aqui de repente e ninguém mais consegue cadastrar, segue o erro:

Warning: pg_query(): Query failed: ERROR: duplicate key violates unique constraint "pk_oscpd_codigo" in cadastro_oscpd.php on line 55
Desculpe mas houve um erro ao tentar cadastrar.


Eu agradeço quem puder me ajudar, valeu!

Leandro
Leandro : São Paulo - SP : leandro@interati.com.br

Usuário: PHP - Postgre - MySQL
Aprendendo: PHP - Postgre - MySQL

Usuário Experiente:
Softwares - Dreamweaver - Photoshop - Corel Draw - Flash (básico)
Ferramentas - Google AdWords - Yahoo! Search Marketing

#2 MarkApollo

MarkApollo

    Turista

  • Usuários
  • 44 posts
  • Sexo:Não informado
  • Localidade:Viana

Posted 11/12/2006, 08:23

O sistema está tentando gravar um registro na tabela, mas está colocando um valor que já existe para o campo "pk_oscpd_codigo", por isso está dando "duplicate key violates"(violação de chave duplicada)

verifique se o campo código na tabela não é auto incremento, pois se for, não é necessário específicar um valor para ele quando for adicionar um registro, caso não seja, vc terá que pegar o maior código e somar 1, tipo, se o ultimo foi 49, o registro atual terá que ser 50,

qualquer dúvida, poste o script que tá dando o erro!!!

flw

#3 le_sampaPHP

le_sampaPHP

    Novato no fórum

  • Usuários
  • 11 posts
  • Sexo:Não informado
  • Localidade:São Paulo - SP
  • Interesses:PHP - Postgre - MySQL - Ajax

Posted 11/12/2006, 09:07

Obrigado por me ajudar, segue a linha do script que está dando erro: (linha 55)

$numero = pg_query ("SELECT * FROM os_cpd WHERE maquina='$maquina' AND cod_dep='$departamento' AND criacao=to_date('$data','DD/MM/YYYY') AND horac='$hora' LIMIT 1");

Segue o script inteiro da página onde está acontecendo o erro (cadastro_oscpd.php):

<?php	
	
	include_once ("./include/config.php");
	include_once ("./include/functions.php");
	
	$nome = $_REQUEST['nome'];
	$email = $_REQUEST['email'];
	$departamento = $_REQUEST['dpto'];
	$tipo = $_REQUEST['tipo'];
	
	$local = $_REQUEST['local']; 
	
	$find_local = pg_query ("SELECT * FROM localizacao WHERE codigo='$local'");
	$result = pg_fetch_array($find_local);
	$ativo = $result['ativo'];
	$cod_local = $result['codigo'];
	unset ($result);
	pg_free_result($find_local);
		
	$descricao = addslashes(nl2br($_REQUEST['descricao']));
	
	if (empty ($departamento) || (empty ($local) && $local != "Localização")){
		echo "
			<script language=\"JavaScript\">
				alert (\"Os campos Local e Departamento devem ser preenchidos\");
				history.go(-1);
			</script>
		";
		exit;
	}
	
	$position = validacao_mail_os ($email,$restringe_email,$validos_email);
	
	if (!$position){
		echo "
			<script language=\"JavaScript\">
				alert (\"Desculpe mas o e-mail digitado não é um e-mail valido!\");
				history.go(-2);
			</script>
		";
		exit;
	}
	
	$ip = $_SERVER['REMOTE_ADDR'];
	$maquina = gethostbyaddr($ip);
	$data = date("d/m/Y");
	$hora = date("H:i");
	
	if (isset($nome) || isset($email) || isset($departamento) || isset($local) || isset($descricao)){
		
		if (onde_envia($ativo,$tipo)){
			if(pg_query("INSERT INTO os_cpd (\"nome\", \"ip\", \"maquina\", \"cod_dep\", \"cod_local\", \"descricao\", \"criacao\", \"horac\", \"email\",\"estado\",\"dono\") VALUES
									('$nome','$ip','$maquina','$departamento','$cod_local','$descricao',to_date('$data','DD/MM/YYYY'),'$hora', '$email','pendente','00000')")){
				
				$numero = pg_query ("SELECT * FROM os_cpd WHERE maquina='$maquina' AND cod_dep='$departamento' AND criacao=to_date('$data','DD/MM/YYYY') AND horac='$hora' LIMIT 1");
				$codigo = pg_fetch_array($numero);

				echo "<div id=\"restrito\">\n
						<dl><dt id=\"top\"> </dt>\n
							<dd id=\"normal\">\n<br />
							<p id=\"centro\"><b>$nome sua Ordem de Serviço foi cadastrada com sucesso.<br /></b>\n
							<br />Com o seguinte código ".$codigo['codigo']."</p>\n
							</dd>\n
						</dl>\n
					 </div>\n
					  ";
				
				$headers  = "MIME-Version: 1.0\r\n";
				$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
				$headers .= "From: Intranet<intranet@empresa.com.br>\r\n";
				
				
				
				$body = "<font size=2 face=verdana color=#000000<b>$nome</b> Ordem de Serviço foi cadastrada com sucesso.<br>";
				$body .= "Com o seguinte código ".$codigo['codigo']."<br>";
				$body .= "Para para visualizar sua os <a href=\"http://$server/index.php?conteudo=YnVzY2Ffb3M=&n_os=".$codigo['codigo']."\">Clique Aqui</a>";

				mail($email,"OS cadastrada",$body,$headers);
				
				pg_free_result($numero);
			}
			else{
				echo "<p id=\"centro\">Desculpe mas houve um erro ao tentar cadastrar.</p>";
			}
			
		}
		else {
			if(pg_query("INSERT INTO os_cpd (\"nome\", \"ip\", \"maquina\", \"cod_dep\", \"cod_local\", \"descricao\", \"criacao\", \"horac\", \"email\",\"estado\",\"dono\") VALUES
									('$nome','$ip','$maquina','$departamento','$cod_local','$descricao',to_date('$data','DD/MM/YYYY'),'$hora', '$email','llevon','00000')")){
				
				$numero = pg_query ("SELECT * FROM os_cpd WHERE maquina='$maquina' AND cod_dep='$departamento' AND criacao=to_date('$data','DD/MM/YYYY') AND horac='$hora' LIMIT 1");
				$codigo = pg_fetch_array($numero);

				echo "<div id=\"restrito\">\n
						<dl><dt id=\"top\"> </dt>\n
							<dd id=\"normal\">\n<br />
							<p id=\"centro\"><b>$nome sua Ordem de Serviço foi enviada com sucesso a empresa. Sendo o CPD isento da manutenção desta máquina<br /></b>\n
							<br />Para controle do CPD temos um cópia de sua OS através do código ".$codigo['codigo']."</p>\n
							</dd>\n
						</dl>\n
					 </div>\n
					  ";
				
				$headers  = "MIME-Version: 1.0\r\n";
				$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
				$headers .= "From: $email<$email>\r\n";
				
				$body = "<font size=2 face=verdana color=#000000<b>$nome</b> Ordem de Serviço foi cadastrada com sucesso.<br>";
				$body .= "Com o seguinte código ".$codigo['codigo']."<br>";
				$body .= "Para para visualizar sua os <a href=\"http://$server/index.php?conteudo=YnVzY2Ffb3M=&n_os=".$codigo['codigo']."\">Clique Aqui</a>";

				mail($email,"OS cadastrada",$body,$headers);
				
				$nome_local = pg_query ("SELECT nome,codigo FROM localizacao WHERE codigo='$local' LIMIT 1");
				
				$texto = "<p><font size=2 face=verdana color=#00000>\n";
				$texto .= "<b>Localização:</b> ".pg_result($nome_local,0)."   <br>";
				$texto .= "<b>Data:</b> $dia/$mes/$ano    <br>";
				$texto .= "<b>Hora: </b>".date("H:i")."   <br>";
				$texto .= "<b>E-mail: </b>".$email."   <br>";
				$texto .= "<b>Descrição:</b> <br>";
				$texto .= $descricao;
				$texto .= "</font></p>\n";
				mail($emailterceiros,"Chamado EMPRESA local ".pg_result($nome_local,0),$texto,$headers);
			}
			else{
				echo "<p id=\"centro\">Desculpe mas houve um erro ao tentar cadastrar.</p>";
			}
		}
	}
	else{
		echo "
			<script language=\"JavaScript\">
				alert (\"Todos campos devem ser preeenchidos corretamente\");
				history.go(-1);
			</script>
		";
	}
?>

Leandro : São Paulo - SP : leandro@interati.com.br

Usuário: PHP - Postgre - MySQL
Aprendendo: PHP - Postgre - MySQL

Usuário Experiente:
Softwares - Dreamweaver - Photoshop - Corel Draw - Flash (básico)
Ferramentas - Google AdWords - Yahoo! Search Marketing

#4 MarkApollo

MarkApollo

    Turista

  • Usuários
  • 44 posts
  • Sexo:Não informado
  • Localidade:Viana

Posted 11/12/2006, 11:25

Rapaz, me parece que o código não está errado, quantos registros você tem na tabela os_cpd, e qual o tipo do campo chave dessa tabela? int? smallint?

talvez seja algum problema no banco..
dê uma olhada


;) ;)

#5 le_sampaPHP

le_sampaPHP

    Novato no fórum

  • Usuários
  • 11 posts
  • Sexo:Não informado
  • Localidade:São Paulo - SP
  • Interesses:PHP - Postgre - MySQL - Ajax

Posted 11/12/2006, 12:22

Olha só, eu também acho que é alguma coisa no banco, porque até a última sexta-feira estava funcionando normalmente e depois parou de cadastrar do nada, aqui é utilizado o Postgre, segue imagem dos registros da tabela os_cpd:

Posted Image

Valeu,

Leandro
Leandro : São Paulo - SP : leandro@interati.com.br

Usuário: PHP - Postgre - MySQL
Aprendendo: PHP - Postgre - MySQL

Usuário Experiente:
Softwares - Dreamweaver - Photoshop - Corel Draw - Flash (básico)
Ferramentas - Google AdWords - Yahoo! Search Marketing

#6 Prog

Prog

    ...

  • Ex-Admins
  • 3761 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro/RJ
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Posted 11/12/2006, 12:54

Quantos registros existem nesta tabela e qual o último código cadastrado?
------
Mero mortal!

#7 le_sampaPHP

le_sampaPHP

    Novato no fórum

  • Usuários
  • 11 posts
  • Sexo:Não informado
  • Localidade:São Paulo - SP
  • Interesses:PHP - Postgre - MySQL - Ajax

Posted 11/12/2006, 13:40

Olá, segue as informações:

Quantidade de registros da tabela os_cpd: 998 (eu dei um count na tabela no SQL)
Último código cadastrado: 01034

Quando eu vou cadastrar na OS, ele cadastra com o número 96496, ai depois deste não é possível cadastrar mais nenhuma OS, então eu alterei os dados do campo Padrão de "lpad((nextval('seq_cpd'::regclass))::text, 5, (0)::text)" para "lpad((nextval('seq_cpd'::regclass))::text, 7, (0)::text)" ...

Ai voltou a cadastrar normalmente, só que com o número gigantesco de 9649640, 9649641.. e por ai vai.

Leandro
Leandro : São Paulo - SP : leandro@interati.com.br

Usuário: PHP - Postgre - MySQL
Aprendendo: PHP - Postgre - MySQL

Usuário Experiente:
Softwares - Dreamweaver - Photoshop - Corel Draw - Flash (básico)
Ferramentas - Google AdWords - Yahoo! Search Marketing

#8 Prog

Prog

    ...

  • Ex-Admins
  • 3761 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro/RJ
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Posted 11/12/2006, 14:41

Acho que há um problema com o seu objeto seq_cpd.
------
Mero mortal!

#9 le_sampaPHP

le_sampaPHP

    Novato no fórum

  • Usuários
  • 11 posts
  • Sexo:Não informado
  • Localidade:São Paulo - SP
  • Interesses:PHP - Postgre - MySQL - Ajax

Posted 11/12/2006, 15:05

Este seq_cpd está como "Sequências" no Postgre, como faço para atualizá-la?

Segue como está configurada em "Sequências":

Nome: seq_cpd
Último valor: 9649678
Incrementar por: 1
Valor máximo: 9223372036854775807
Valor mínimo: 1
Valor de Cache: 1
Contador do log: 30
Foi dado um ciclo? Não
Foi chamado? Sim

Leandro
Leandro : São Paulo - SP : leandro@interati.com.br

Usuário: PHP - Postgre - MySQL
Aprendendo: PHP - Postgre - MySQL

Usuário Experiente:
Softwares - Dreamweaver - Photoshop - Corel Draw - Flash (básico)
Ferramentas - Google AdWords - Yahoo! Search Marketing

#10 Prog

Prog

    ...

  • Ex-Admins
  • 3761 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro/RJ
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Posted 11/12/2006, 16:41

Não tenho certeza, mas acho que a unica maneira é excluindo e criando novamente a sequence, tipo:

drop sequence seq_cpd;
create sequence seq_cpd increment 1 start numero no cycle;


numero = valor o qual você deseja reiniciar sua contagem, último valor a ser incluido na tabela.

ps.: caso tenha dúvidas, obtenha mais informações na documentação.
http://www.postgresq...tesequence.html
------
Mero mortal!

#11 le_sampaPHP

le_sampaPHP

    Novato no fórum

  • Usuários
  • 11 posts
  • Sexo:Não informado
  • Localidade:São Paulo - SP
  • Interesses:PHP - Postgre - MySQL - Ajax

Posted 12/12/2006, 08:14

(y) Obrigado por responder!

Realmente o problema estava na sequência (seq_cpd), digitei o seguinte comando SQL:

ALTER SEQUENCE seq_cpd RESTART WITH NUMERO;


Aí começou a rodar a partir do último código cadastrado.

O comando que você enviou é similar a esse, obrigado por responder e enviar a documentação do postgre.
Leandro : São Paulo - SP : leandro@interati.com.br

Usuário: PHP - Postgre - MySQL
Aprendendo: PHP - Postgre - MySQL

Usuário Experiente:
Softwares - Dreamweaver - Photoshop - Corel Draw - Flash (básico)
Ferramentas - Google AdWords - Yahoo! Search Marketing

#12 Prog

Prog

    ...

  • Ex-Admins
  • 3761 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro/RJ
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Posted 12/12/2006, 09:14

Blz Leandro...

(y)

Bom saber que também existe um ALTER SEQUENCE.
------
Mero mortal!




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq