gildo.rj 0 Denunciar post Postado Novembro 29, 2011 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
hufersil 145 Denunciar post Postado Novembro 29, 2011 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
visitante_php 0 Denunciar post Postado Novembro 29, 2011 pra ter um campo autoincrement no postgre, você precisa colocar o tipo dele como serial...o auto increment dele eh diferente do mysql... Compartilhar este post Link para o post Compartilhar em outros sites
gildo.rj 0 Denunciar post Postado Novembro 29, 2011 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
hufersil 145 Denunciar post Postado Novembro 29, 2011 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
visitante_php 0 Denunciar post Postado Novembro 29, 2011 desculpe, hufersil... Compartilhar este post Link para o post Compartilhar em outros sites
hufersil 145 Denunciar post Postado Novembro 29, 2011 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
gildo.rj 0 Denunciar post Postado Novembro 29, 2011 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
hufersil 145 Denunciar post Postado Novembro 29, 2011 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
gildo.rj 0 Denunciar post Postado Novembro 29, 2011 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
hufersil 145 Denunciar post Postado Novembro 29, 2011 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