Olá galera!
Estou com uma grande dúvida aqui.
Estou querendo criar no meu banco de dados dois campos únicos (sequencial, ano).
O ‘sequencial’ vai começar a partir do valor ‘1’ e vai ser incrementado de 1 a 1 (exemplo: 1,2,3,4,5,6,…).
O ‘ano’ vai valer ‘2012’.
Até aqui eu poderia usar um @GeneratedValue para gerar o ‘sequencial’ para mim automaticamente.
Mas vou precisar de um método para verificar qual o ano atual e inserir no campo ‘ano’ este valor (Exemplo: quando entrar no ano de 2013 este será o valor do campo ‘ano’). Até aqui também creio que não terei problema de implementar este método.
Agora chego na minha dúvida: Quando eu mudar o valor do campo ‘ano’ quero que o campo ‘sequencial’ volte para o valor ‘1’. Sendo assim não posso usar o @GeneratedValue.
Alguém tem uma dica da lógica que posso criar um método para fazer isso pra mim?
realmente você não podera usar o GenerateValue, pois o mesmo trata que o campo com essa antação será usico no BD, isso pode ser tratado como chave composta já que nunca terá o mesmo ano com o mesmo id, caso vc steja trabalhando com ferramente ORM, JPA ou Hibernate é só criar uma entidade com esses valores, e definir essa entidade como chave, porem não consigo enchergar onde essa solução seria usada, qual é o seu problema?
RafaelCassau,
meu sistema precisa ter essa tabela com o sequencial que é reinicializado após mudar o ano. É apenas uma regra de negócio.
Referente a sua sugestão eu acho que fica muito difícil de implementar com chave composta. Utilizando chave composto é possível incrementar os valores do sequencial automaticamente e depois reinicializa-lo?
[quote=Wendell Albino] RafaelCassau,
meu sistema precisa ter essa tabela com o sequencial que é reinicializado após mudar o ano. É apenas uma regra de negócio.
Referente a sua sugestão eu acho que fica muito difícil de implementar com chave composta. Utilizando chave composto é possível incrementar os valores do sequencial automaticamente e depois reinicializa-lo?[/quote]
E em cada registro da tabela o dado ‘ano’ será o mesmo? Isso não se torna redundante?
Se realmente for isso, não é mais fácil pegar a data atual do computador?
Abraços
[quote=Gleidson Henrique]
E em cada registro da tabela o dado ‘ano’ será o mesmo? Isso não se torna redundante?
Se realmente for isso, não é mais fácil pegar a data atual do computador?
Abraços[/quote]
O ano será o mesmo até que o ano atual mude. Depois que o ano mudar o sequencial vai voltar a ser enumerado a partir do valor 1. Vou precisar pegar o ano da data do computador mesmo, mas a minha dúvida é a respeito de fazer esta reinicialização do sequencial depois que mudar o ano.
Se você nao definir nenhuma primary key, não haverá problema em voltar. Porém amigo, está meio estranho essa logica.
Ano é uma coluna na tabela correto?
Pra que voce deseja salvar esse ano? Qual será a finalidade dele futuramente? Nos diga isso para ver se você realmente está no caminho correto.
Abraços
[quote=Gleidson Henrique]Se você nao definir nenhuma primary key, não haverá problema em voltar. Porém amigo, está meio estranho essa logica.
Ano é uma coluna na tabela correto?
Pra que voce deseja salvar esse ano? Qual será a finalidade dele futuramente? Nos diga isso para ver se você realmente está no caminho correto.
Abraços[/quote]
Na verdade ‘ano’ + ‘sequencial’ serão a chava primária desta tabela.
Exemplo:
sequencial | ano
1 | 2012
2 | 2012
3 | 2012
.
.
.
.
n | 2012
e depois que mudar para o ano de 2013 o sequencial inicializa desde o valor 1:
sequencial | ano
1 | 2013
2 | 2013
3 | 2013
.
.
.
n | 2013
e quando mudar novamente de ano o sequencial inicializa novamente.
Será que com trigger é possível fazer isso? (MySql)
[quote=Wendell Albino][quote=Gleidson Henrique]Se você nao definir nenhuma primary key, não haverá problema em voltar. Porém amigo, está meio estranho essa logica.
Ano é uma coluna na tabela correto?
Pra que voce deseja salvar esse ano? Qual será a finalidade dele futuramente? Nos diga isso para ver se você realmente está no caminho correto.
Abraços[/quote]
Na verdade ‘ano’ + ‘sequencial’ serão a chava primária desta tabela.
Exemplo:
sequencial | ano
1 | 2012
2 | 2012
3 | 2012
.
.
.
.
n | 2012
e depois que mudar para o ano de 2013 o sequencial inicializa desde o valor 1:
sequencial | ano
1 | 2013
2 | 2013
3 | 2013
.
.
.
n | 2013
e quando mudar novamente de ano o sequencial inicializa novamente.
Será que com trigger é possível fazer isso? (MySql)
[/quote]
Mano,eu acho q vc está esquentando a cabeça a toa,pq? VC consegue fazer um select na tabela e recuperar as informaçoes através do ORDER, ai vc pode selecionar os anos 2012 ou 2013 ou 20eN;
Pq,eu acho isto?vamos utilizar o seu proprio conceito vc quer montar uma chave composta por ID e Ano! independentemente do id começar com 1 e depois zerar e voltar pra 1 no novo ano vc sempre terá ID’S diferentes e sua chave composta nunca será igual!
Acho vc não deve se preocupar com isso.
Faça da forma simples.
Obs: (A não ser q vc queira fazer alguma logica q não entendi com pode ser empregado nesse contexto)
E as outras informações, serão excluidas?
Se sim, voce da um truncate nomeTabela
Se somente sera atualizado o ano 2012 para 2013, de um update geral para essa coluna: update nomeTabel set ano = 2013
Se voce quer que continue com os dados de 2012 e comece novamente o contador 1, 2, 3, ele nao pode ser chave primaria, chave primaria é somente uma e nao se repete.
Abraços
Pessoal, fiz uma trigger aqui.
Quero um feedback de vcs para melhorar a lógica
delimiter $$
create trigger t_gera_codigo before insert on empenho for each row
BEGIN
-- @ultimo (retorna o ultimo sequencial da tabela
SET @ultimo = (SELECT sequencial FROM empenho ORDER BY codigo DESC LIMIT 1 );
-- @maior (retorna o maior ano na tabela
SET @maior = (SELECT Max(ano) FROM empenho);
-- @total (retorna a quantidade de registro na tabela
SET @total = (SELECT Count(*) from empenho);
-- @ano (retorna o ano a ser cadastrado na tabela
SET @ano = NEW.ano;
-- se nao existir registros o primeiro sequencial eh 1
IF (@total = 0) THEN
SET NEW.sequencial = 1;
END IF;
-- se o ano a ser cadastrado eh igual ao maior existente entao o sequencial incrementa seu ultimo valor + 1
IF(@ano = @maior) THEN
SET NEW.sequencial = @ultimo + 1;
-- se o ano nao for igual (maior) entao o sequencial inicializa a contagem
ELSE
SET NEW.sequencial = 1;
END IF;
END$$
Acho que agora ficou melhor:
delimiter $$
create trigger trigger_gera_sequencial before insert on empenho for each row
BEGIN
-- @maior_ano (retorna o maior ano do empenho)
SET @maior_ano = (SELECT Max(ano) FROM empenho);
-- @ano (retorna o ano a ser cadastrado na tabela)
SET @ano = NEW.ano;
-- @sequencial (retorna o maior sequencial do ano a ser cadastrado)
SET @sequencial = (SELECT Max(sequencial) from empenho where ano = @ano);
-- se nao existir registros o primeiro sequencial eh 1
IF (@sequencial is null) THEN
SET NEW.sequencial = 1;
END IF;
-- se o ano a ser cadastrado eh igual ao maior existente entao o sequencial incrementa seu ultimo valor + 1
IF(@ano = @maior_ano) THEN
SET NEW.sequencial = @sequencial + 1;
END IF;
IF (@ano < @maior_ano)THEN
-- forca um erro
SET NEW.sequencial = null;
END IF;
END$$