Ir para conteúdo

POWERED BY:

Arquivado

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

rebortec

Evitar colisões

Recommended Posts

Boas pessoal,

 

Tou com um problema que é:

 

Tenho de fazer um instert na bd verificando o ultimo id e somar 1 a esse registo, imaginando que o ultimo é 1000 e o proximo é 1001.

 

Até ai td bm faço lock á tabela e funciona. O problema é que isso influência a performance e não queria isso.

 

Alguém tem alguma sugestão de como o fazer, perdendo o mínimo de performance e evitar colisões e repetição de dados?

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, utiliza um campo auto increment que resolve o problema.

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

há como você utilizar um recurso do propio banco de dados AUTO INCREMENTO.

// para sql server troque MODIFY por ALTER
 
ALTER TABLE `tabela` MODIFY COLUMN `tabela`.`coluna` int not null auto_increment
 

Ele incrementará automaticamente a coluna a cada registro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ja testou algo como:

 

INSERT INTO tabela (id, valor1, valor2) VALUES ( (select max(id)+1 from tabela2), "valor1", "valor2"); ?


se for mySQL :

 

alter table tabela modify coluna int not null auto_increment


subsititua tabela pelo nome da sua tabela e coluna pelo nome da sua coluna, ai pronto....


uma solução "paliativa"

INSERT INTO sua_tabela( coluna_com_o_valor, dado1)
VALUES (

(

SELECT MAX( t2.coluna_com_o_valor) +1
FROM sua_tabela t2
), "conteudo_de_dado_2";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boas,

 

Posso utilizar mais do que 1 autoincrement por tabela? É que ja tem 1.

 

É do genero o user pode colocar um id manualmente ou utilizar o proximo livre.

 

Vou exemplificar:

 

No software, nao tenho uma tabela para clientes outra para fornecedores, tenho uma para os dois, porque os campos sao os mesmos.

 

Um cliente pode ser fornecedor também e podem ter códigos diferentes.

 

Existe um campo id, codigo-cliente e codigo-fornecedor.

 

O codigo-cliente ou fornecedor é colocado pelo user ou entao é o proximo codigo vazio.

 

O id ja ocupa a posição de primary key e auto increment.

O que pretendo é manter o ACID da bd, visto que é uma app multi empresa, ambas teem clientes, e todas as listas de clientes começam do numero 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como faria? sabendo que sao multiplas empresas, e utilizam ambos a mesma tabela? O utilizador tem de criar o codigo de cliente que quiser, nao pode ser automático visto que os clientes podem ter ja um numero definido antes de utilizarem esta aplicação, logo ao migrar para este app têm de manter os codigos de cliente anteriores.

Compartilhar este post


Link para o post
Compartilhar em outros sites

conforme comentei acima,

 

estude "modelagem de dados"

 

estude bem o business model (as regras do negócio)

 

dependendo do porte do sistema pode ser inviável fazer isso sozinho..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois eu já estive a ler bastante, e pelo que vi tem mesmo que ser assim, até ao criar uma fatura tambem tem da mesma forma, visto que a numeração tem de ser sequencial, e não pode ser auto increment. São vários users a criar fatura pode ser atribuido o mesmo id a dois que emitam a fatura ao mesmo tempo, e isso n pode acontecer. Só vejo uma forma que é fazer lock ao registo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existem outras formas.

Se você analisar outros SGBD's, verá que alguns utilizam o conceito de sequência.

No MySQL, não existem sequences (auto increment, no meu ponto de vista, é bem diferente do mostrado acima), mas você pode emular.

 

Veja este tópico, acho que ele contém a resposta que você precisa.

 

http://stackoverflow.com/questions/805808/emulating-a-transaction-safe-sequence-in-mysql

 

@braços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

#9

nao entendeu nada...

 

bom, grave o id cliente como char(25)

 

o valor, para evitar colisões, padronize com timestamp.

 

no php, vc obtém timestamp com as funções

 

time() e microtime()

 

 

note que isso não é "a solução definitiva".

é uma mera sugestão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim eu sei que é sugestão, mas como é que com o timestamp evito todas as possibilidades de colisões?

Existem outras formas.

Se você analisar outros SGBD's, verá que alguns utilizam o conceito de sequência.

No MySQL, não existem sequences (auto increment, no meu ponto de vista, é bem diferente do mostrado acima), mas você pode emular.

 

Veja este tópico, acho que ele contém a resposta que você precisa.

 

http://stackoverflow.com/questions/805808/emulating-a-transaction-safe-sequence-in-mysql

 

@braços.

Muito bom vou testar obrigado

A bd que estou a utilizar é mysql 5.5

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.