Em 11/02/13, Fabiano Listas<[email protected]> escreveu:
> Em 11-02-2013 10:42, Fabiano Listas escreveu:
>> Em 10-02-2013 20:43, Osvaldo Kussama escreveu:
>>> Em 10/02/13, Fabiano Listas<[email protected]> escreveu:
>>>> Bom dia, colegas!
>>>>
>>>> Considerem a seguinte situação: eu criei um BD chamado "escola" e uma
>>>> tabela chamada "alunos". Na tabela "alunos", criei as seguintes
>>>> colunas,
>>>> nesta ordem: aluno (varchar), id_aluno (int) e data_nasc (date). Setei
>>>> "aluno" como sendo NOT NULL e "id_aluno" como sendo NOT NULL e "auto
>>>> increment" (serial).
>>>> Na hora de dar um "INSERT INTO alunos VALUE (etc, etc, etc);",
>>>> obviamente não será preciso que seja inserido o campo "id_aluno",
>>>> pois o
>>>> próprio SGBD cuida disso pra mim. Acontece que eu não sabia como
>>>> deveria
>>>> proceder. Pra mim, o fato de digitar: "INSERT INTO alunos VALUE ('José
>>>> dos Anzóis Furados', 26/09/2003)" já fazia com que o SGBD entendesse o
>>>> que deveria ser feito. Porém, na hora de dar um "select * from" na
>>>> tabela vi que o campo "data_nasc" estava vazio e o "id_aluno" estava
>>>> "-2008"! Tudo bem, então, vamos consertar o prejuízo manualmente:
>>>> dei um
>>>> UPDATE e setei o campo "id_aluno" como deveria estar! Porém, ao tentar
>>>> inserir outro aluno (somente com o nome do aluno e mais nada) o SGDB
>>>> reclamou:
>>>>
>>>> escola=# INSERT INTO alunos VALUES ('José Bibiano Trigueiro');
>>>> ERROR: duplicate key value violates unique constraint "alunos_pkey"
>>>> DETAIL: Key (id_aluno)=(1) already exists.
>>>>
>>>> Diante disto eu pergunto:
>>>>
>>>> 1. Como "pular" o id_aluno na hora de inserir dados na tabela?
>>> INSERT INTO alunos VALUE ('José dos Anzóis Furados', DEFAULT,
>>> '26/09/2003');
>>
>> Boa!!!
>>>
>>> ou especificar a lista dos campos sendo inseridos:
>>> INSERT INTO alunos(aluno, data_nasc ) VALUE ('José dos Anzóis
>>> Furados', '26/09/2003');
>> Dessa eu não gostei. Se a lista de campos for longa eu me lasco!
>>>
>>>
>>>> 2. Como consertar esse erro para que ele volte a inserir os dados
>>>> corretos na tabela, já que ele vai tentar inserir a chave inteira 1 sem
>>>> sucesso sempre? Ou seja, se uma coluna é auto increment e mesmo assim
>>>> for setado um valor para ela "na marra", na próxima iteração o SGDB vai
>>>> querer usar o valor que foi setado na marra e ele vai reclamar. O que
>>>> fazer?
>>> Veja a função setval:
>>> http://www.postgresql.org/docs/current/interactive/functions-sequence.html
>>>
>>>
>> Vou ler assim que eu clicar em "Enviar". :)
> Li, mas não ficou claro, apesar de eu ter lido várias vezes com bastante
> atenção. Eles dizem como a função funciona, mas não cita exemplos. A
> explicação está muito abstrata, fora de contexto. Vou procurar na NET
> outras explicações para o mesmo tema. Achei também isso
> http://pgdocptbr.sourceforge.net/pg80/sql-altersequence.html , mas ainda
> não li. Vou ler e digo se se encaixa no meu problema.
Tente:
SELECT setval('nome_de_sua_sequencia', max(id_aluno)) FROM alunos;
A partir daí as novas inclusões serão feitas a partir do maior
id_aluno já existente em sua tabela alunos.
Osvaldo
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral