rebortec 0 Denunciar post Postado Março 31, 2014 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
Rafael Impacto 15 Denunciar post Postado Março 31, 2014 Amigo, utiliza um campo auto increment que resolve o problema. Abraço Compartilhar este post Link para o post Compartilhar em outros sites
TalissonBento 14 Denunciar post Postado Março 31, 2014 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
Will Knippelberg 10 Denunciar post Postado Março 31, 2014 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) +1FROM sua_tabela t2 ), "conteudo_de_dado_2"; Compartilhar este post Link para o post Compartilhar em outros sites
rebortec 0 Denunciar post Postado Março 31, 2014 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
hinom 5 Denunciar post Postado Março 31, 2014 #5 a modelagem está errada. todavia, se quer continuar assim, sugiro que use timestamp para incrementar a "lambança" http://php.net/microtime mas aconselho a consertar isso.. Compartilhar este post Link para o post Compartilhar em outros sites
rebortec 0 Denunciar post Postado Março 31, 2014 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
hinom 5 Denunciar post Postado Março 31, 2014 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
rebortec 0 Denunciar post Postado Março 31, 2014 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
hufersil 145 Denunciar post Postado Março 31, 2014 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
hinom 5 Denunciar post Postado Março 31, 2014 #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
rebortec 0 Denunciar post Postado Março 31, 2014 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
hinom 5 Denunciar post Postado Março 31, 2014 faz um esforcinho e digita timestamp no google Compartilhar este post Link para o post Compartilhar em outros sites
rebortec 0 Denunciar post Postado Março 31, 2014 Eu sei o que é timestamp, no entanto não me resolve o problema . Compartilhar este post Link para o post Compartilhar em outros sites