Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gildo.rj

Auto increment no postgre não funciona.

Recommended Posts

Bom dia Grupo. Não sei se é mesmo aqui que devo postar essa duvida, mas a ultima vez que postei no forum do PostGre não obtive respostas.

 

Vamos ao problema: Tenho um campo serial(autoincrement) no PostGre, acontece que na hora do insert ele não aceita a instrução e da erro dizendo que o campo é not null, mas se tiro a instrução not null ele grava mas não incrementa. Alguem já passou por isso?

 

Me ajudem por favor, minhas ferias dependem disso hehehe...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mostre como é o insert que você está gerando.

Só para adiantar, tente executar a SQL sem declarar o campo no insert.

Ou seja, ao invés de

 

insert into tabela (codigo, nome) values (null, 'teste');

 

tente

 

insert into tabela (nome) values ('teste');

 

ou ainda:

 

insert into tabela (codigo, nome) values (default, 'teste');

 

 

Acabei de testar as duas ultimas formas citadas em um PostgreSQL 9.0 e foi de boa.

 

@braços e fique com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hufersil testei via terminal e não funfo, li alguma coisa sobre uma função que tem de ser colocado antes do insert, vou testar pra ver.

 

Igor essa ação eu já sabia, mas não é tão simples assim, ainda mais trabalhando-se com PDO.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você realmente criou a tabela com o campo do tipo serial?

Quando criou a tabela apareceram os notices indicando a criação das sequencias?

 

exemplos dos notices

NOTICE:  CREATE TABLE will create implicit sequence "teste_codigo_seq" for serial column "teste.codigo"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "teste_pkey" for table "teste"
Query returned successfully with no result in 343 ms.

 

Igor, não necessariamente precisar ser serial.

O tipo "serial" do postgres nada mais faz do que criar um campo do tipo integer e internamente colocar o default value nextval('nome da sequencia')

 

http://www.postgresql.org/docs/8.1/static/datatype.html#DATATYPE-SERIAL

 

Confirme se criou a tabela corretamente com o tipo SERIAL.

 

@braços e fiquem com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

desculpe, hufersil...

 

Capaz, amigo, fica tranquilo ;)

A ideia é essa mesmo: compartilhar conhecimento.

Caso a forma como postei te ofendeu, não era essa a intenção. Era só mostrar mesmo que no postgres o serial é um "pseudo-tipo".

 

@braços e fique com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

hufersil, crie tudo certinho sim, tanto que navegando pela tabela eu insiro os dados e ele incrementa certinho, só não consigo via codigo. vou postar parte do codigo para sua analise:

if($_REQUEST['edit']==0) {
           try{
               $time = date('d-m-Y H:i:s');
               TTransacao::open('pg');
               TTransacao::setLogger(new TLoggerHTML('logs/professores.html'));
               TTransacao::log("Usuário: {$usuario} inseriu o seguinte registro ao banco de dados:");

               $sql = new TSqlInsert;
               $sql->setEntidade('horarios');
               //$sql->setRowData('id', $_REQUEST['id']);
               $sql->setRowData('horario', $_REQUEST['horario']);


               $conn = TTransacao::get();
               $res = $conn->query($sql->getInstrucao());
               TTransacao::log($sql->getInstrucao());
               TTransacao::close();
               $id = $_REQUEST['id'];
               $criterio2 = new TCriterio;
               $criterio2->add(new TFilter('id', '=', $id));
               //instancia o objeto TSqlSelect que executará a instrução SELECT no banco de dados
               $sql2 = new TSqlSelect;
               //define a tabela que será alterada
               $sql2->setEntidade('horarios');
               //define a coluna que será alterada
               $sql2->addColuna('*');

               $sql2->setCriterio($criterio2);

               try{
                   //seleciona o banco de dados a ser utilizado
                   $conn2 = TConnect::open('pg');
                   //executa a cunsulta no banco de dados já com os critérios
                   $res2 = $conn2->query($sql2->getInstrucao());
                   //percorre o banco de dados adcionando os registros ao array $ret[]
                   if($res2->rowCount($sql2->getInstrucao()) > 0){

                       $ret2 = $res2->fetch(PDO::FETCH_ASSOC);

                       $smarty->assign('foto',$ret2);   
                   }

               }
               //caso exista algum essto imprime a mensagem
               catch (Exception $e){
                   echo $e->getMessage();

               }
               $smarty->assign('id',$_REQUEST['id']);
           }
           catch(Exception $e){
               echo $e->getMessage();  
               TTransacao::rollback();
           }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, e você consegue recuperar qual é o comando SQL gerado pelo seu código PHP para nos mostrar?

 

@braços e fique com Deus.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eis minha classe de inserção:

<?php

/*
* Esta classe executa uma instrução INSERT no db
*/

final class TSqlInsert extends TSqlInstruction{

   public function setRowData($coluna, $valor){
       if(is_string($valor)){
           $valor = addslashes($valor);
           $this->valorDaColuna[$coluna] = "'$valor'";
       }
       else if(is_bool($valor)){
           $this->valorDaColuna[$coluna] = $valor ? 'TRUE' : 'FALSE';
       }
       else if(isset($valor)){
           $this->valorDaColuna[$coluna] = $valor;
       }
       else{
           $this->valorDaColuna[$coluna] = "NULL";
       }
   }

   public function setCriterio($criterio) {
       throw new Exception("Não foi possível chamar a função setCriterio de ". __CLASS__);
   }

   public function getInstrucao() {
       $this->sql = "INSERT INTO {$this->entidade} (";
       $colunas   = implode(', ', array_keys($this->valorDaColuna));    //monta uma string com o nome das colunas
       $valores   = implode(', ', array_values($this->valorDaColuna));  //monta string contendo os valores
       $this->sql.= $colunas.')';
       $this->sql.= " VALUES ({$valores})";

       return $this->sql;
   }
}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gildo,

 

Precisamos do comando SQL gerado por sua classe (INSERT INTO ...)

Ou seja, o comando SQL que ela gera para executar no banco.

O que está parecendo, é que ela está colocando algum valor na coluna que não deveria.

 

@braços e fique com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.