Olha o problema, sei que muitas pessoas ja passou por isso, vou salvar um registro e queria saber com qual PK o registro vai ser salvo! Considerando que outras pessoas tambem podem inserir outros registros,
Acho que seria um sequencia assim:
1- salvo um registro e logo faço um update
assim o registro fica bloqueado.
mas a tabela tem relacionamento e eu vou precisar de um registro da tabela que tem relacionamento,
e se atabela nao tiver registro ?, …, …, … .
inti=consultanoBanco("SELECT nextval('serial');");//avariáveliagoratemachavedoregistro;inserteNobanco("INSERT INTO distributors VALUES ("+i+", 'nothing')");
Claro que não dessa maneira terrível que eu apresentei…
Apenas para exemplificar
javaAurelio
As chaves estao auto_increment,
Cara inicialmente o banco usado é o PostgreSQL , nao sei se vai mudar !
nbluis
Mas autoincrement são exatamente as sequences do postgree não?
javaAurelio
Sim, mas ve so .
Eu abro um formulario que me traz o numero do Protocolo que é o numero da PK da Tabela,
Outro pessoa abre um outro formulario que me traz o numero do Protocolo que é o numero da PK da Tabela.
Qunado os dois forem salvar, alguem vai ter o numero de protocolo trocado.
Quem fez o sistema pegou a proxima PK e apresentou como numero de protocolo.
nbluis
Vixi… posso dar apenas um conselho…
Refactoring: Improving the Design of Existing Code (Fowler)
Acho que vc não vai conseguir resolver esse problema sem mexer nisso.
Um Sequence trabalha exatamente esse problema recorrente, a concorrência das chaves unicas.
Uma sequence nunca (eu disse nunca) vai liberar um mesmo id em consulta com nextval.
Logo, já pode prever o que vai ter que trabalhar… boa sorte…
entao salvo com o numero do select nextval(‘seq_protocolo’);
Salvo.
nbluis
não precisa do setval…
V
ValeskaFCF
Ola!
Tente utilizar o currval('nome_sequence'), ele pega o registro que está sendo inserido no momento.
Por exemplo:
//Insere na tabela Eventostm=conn.prepareStatement("INSERT INTO Evento (idCadastroPessoa, idTipoEvento, dataEvento, valorEvento, obs) VALUES (?, ?, ?, ?, ?)");//Insere na tabela MatriculaRenovacao com a PK da tabela Eventostm=conn.prepareStatement("INSERT INTO MatriculaRenovacao (idEvento, horaMatricula, tipo) VALUES (currval('evento_idevento_seq'), ?, ?)");
Não sei se era isto q vc precisava
nbluis
O currval não vai garantir a concorrência.
V
ValeskaFCF
E se colocar dentro de uma transação?
Eu utilizo assim e aparentemente funciona…
nbluis
Mesmo em uma transação.
Se tiver concorrência terá problemas.
Para isto existem sequences.
Consultando o id (único) antes de inserir, é impossível problemas de concorrência (teoricamente é claro, nunca sabemos o improvável).
Até…
BiraBoy
Cara, apenas dê um insert com nextval(‘sequence_da_tabela’) . Ele não dá dois inserts com o mesmo ID se usar nextval e ponto.
Nunca vi usar select com nextval. Pra que vc tah fazendo isso?
nbluis
Um insert com nextval é um select implicito.
O Select é usado quando vc quer obter o id antes de inserir (que é o titulo desta thread).