Ir para conteúdo
Fórum Script Brasil
  • 0

Campo Autoincrement "decrementando"


MARCO ELOY

Pergunta

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

  • 0

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

Nã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

  • 0

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

  • 0

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 por MARCO ELOY
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,7k
×
×
  • Criar Novo...