MARCO ELOY Postado Outubro 8, 2008 Denunciar Share Postado Outubro 8, 2008 Olá a todos,Existe uma forma de inibir o DECREMENTO no valor do AUTOINCREMENT de uma tabela quando o ultimo registro dela é removido?INSERT INTO TabAtivo(CAMPO) VALUES (NULL); #INSERIU 1 / AUTOINCREMENT PASSA A SER 2INSERT INTO TabAtivo(CAMPO) VALUES (NULL); #INSERIU 2 / AUTOINCREMENT PASSA A SER 3INSERT INTO TabAtivo(CAMPO) VALUES (NULL); #INSERIU 3 / AUTOINCREMENT PASSA A SER 4DELETE FROM TabAtivo WHERE CAMPO = 3; #REMOVEU 3 / AUTOINCREMENT VOLTA A SER 3 Link para o comentário Compartilhar em outros sites More sharing options...
0 Denis Courcy Postado Outubro 8, 2008 Denunciar Share Postado Outubro 8, 2008 Olá a todos,Existe uma forma de inibir o DECREMENTO no valor do AUTOINCREMENT de uma tabela quando o ultimo registro dela é removido?INSERT INTO TabAtivo(CAMPO) VALUES (NULL); #INSERIU 1 / AUTOINCREMENT PASSA A SER 2INSERT INTO TabAtivo(CAMPO) VALUES (NULL); #INSERIU 2 / AUTOINCREMENT PASSA A SER 3INSERT INTO TabAtivo(CAMPO) VALUES (NULL); #INSERIU 3 / AUTOINCREMENT PASSA A SER 4DELETE FROM TabAtivo WHERE CAMPO = 3; #REMOVEU 3 / AUTOINCREMENT VOLTA A SER 3Não. Não existe.Mas você pode usar um semáforo para inserção de registros para que somente um grave de cada vez.Assim você pode consultar o max(campo) que retornará 3 (no seu caso) e você grava 3+1 que é 4.Veja o uso de semáforo com a função Get_lock. Verifique o manual do Mysql para mais detalhes. Link para o comentário Compartilhar em outros sites More sharing options...
0 MARCO ELOY Postado Outubro 9, 2008 Autor Denunciar Share Postado Outubro 9, 2008 A tabela ta com 10.000 registros e é consultada constantemente. Alem disso tenho inserssies concorrentes. Isso pode ficar lento e não me garante a atomicidade na chave uma vez que umaa 2a consulta pode ser freira antes da 1a insersao, o que geraria chave duplicada. Acumulei o valor numa outra tabela e criei uma trigger para calculo da chave mas ainda naop testei a inserssão concorrente. Tente usar o "lock table" mas o mysql não adimite essa funcao dentro de scripts!DELIMITER $$UPDATE tsys_sequencia set CODIGO_TITULO = (SELECT MAX(TREC_CODIGO_PK+1) FROM trec_aberto);DROP TRIGGER IF EXISTS TG_BI_TREC_ABERTO;CREATE TRIGGER TG_BI_TREC_ABERTO BEFORE INSERT ON trec_aberto FOR EACH ROW BEGIN SELECT CODIGO_TITULO + 1 INTO @CODIGO_TITULO FROM tsys_sequencia; UPDATE tsys_sequencia set CODIGO_TITULO = @CODIGO_TITULO; SET NEW.TREC_CODIGO_PK = @CODIGO_TITULO; END;$$DELIMITER ;Nunca utilizaei semaforos... vou pesquisar Link para o comentário Compartilhar em outros sites More sharing options...
0 MARCO ELOY Postado Outubro 9, 2008 Autor Denunciar Share Postado Outubro 9, 2008 (editado) GET_LOCK Segue o mesmo principio do lock tables... não da pra usar dentro deprocedure e a inserção na tabela é feita via proedure. O melhor resultado que eu obtive foi mesmo usando uma trigger no before insert que calcula a pk.O grilo continua sendo o insert simultaneo, uma vez que o select é mais rápido que o insert/update e o valor da chave que eu guardo em tsys_sequencia.CODIGO_TITULO so muda depois do fim da 1a tranzação, que facilmente ocorre entre o select e o insert da 2a. Editado Outubro 9, 2008 por MARCO ELOY Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
MARCO ELOY
Olá a todos,
Existe uma forma de inibir o DECREMENTO no valor do AUTOINCREMENT de uma tabela quando o ultimo registro dela é removido?
INSERT INTO TabAtivo(CAMPO) VALUES (NULL); #INSERIU 1 / AUTOINCREMENT PASSA A SER 2
INSERT INTO TabAtivo(CAMPO) VALUES (NULL); #INSERIU 2 / AUTOINCREMENT PASSA A SER 3
INSERT INTO TabAtivo(CAMPO) VALUES (NULL); #INSERIU 3 / AUTOINCREMENT PASSA A SER 4
DELETE FROM TabAtivo WHERE CAMPO = 3; #REMOVEU 3 / AUTOINCREMENT VOLTA A SER 3
Link para o comentário
Compartilhar em outros sites
3 respostass a esta questão
Posts Recomendados