Ir para conteúdo

POWERED BY:

Arquivado

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

MARCO ELOY

Campo AUTOINCREMENT "DECREMENTANDO"

Recommended Posts

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 Tab(CAMPO) VALUES (NULL); #INSERIU 1 / AUTOINCREMENT = 2

INSERT INTO Tab(CAMPO) VALUES (NULL); #INSERIU 2 / AUTOINCREMENT = 3

INSERT INTO Tab(CAMPO) VALUES (NULL); #INSERIU 3 / AUTOINCREMENT = 4

DELETE FROM Tab WHERE CAMPO = 3; #REMOVEU 3 / AUTOINCREMENT = 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

não. a função autoincremento não funciona assim e não tem como fazer ela funcionar.

o que você pode fazer para obter isso é cria uma function que lhe retorne o maior valor.

 

tipo assim, ao invés de usar o autoincremento para inserir você faz a consulta na tabela e pega o maior valor mais 1

 

var
 novo_id: number;
begin
 select max(id) + 1 
 into novo_id
 from tabela

insert into tabela (id, desc) values (novo_id, 'desc');

end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

A tabela ta com 10.000 registros e eh 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 nao 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 ;

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.