PROBLEMA PK COMPOSTA MYSQL E DELETE TRIGGER?
Numero (bigint) PRIMARY KEY
Mes (varchar) PRIMARY KEY
Ano (int) PRIMARY KEY
Item (bigint) <- PRIMARY KEY E AUTO_Increment
preciso que os dados fiquem da seguinte forma:
1 08 2016 1
1 08 2016 2
Porem quando eu vou colocar o 2 12 2016 deveria ser :
2 12 2016 1
só que na verdade fica:
Alguem sabe alguma forma de eu resolver isso? preciso criar uma Constraint ? na tabela de orçamento tive o mesmo problema porém não sei nem como consegui resolver que do nada começou a funcionar e contar os orçamentos..
OBS: tentei utilizando uma trigger abaixo porem esta dando erro
CREATE TRIGGER Orcamento_Item BEFORE INSERT ON ordemservicocotacaoitem_hc
FOR EACH ROW BEGIN
DECLARE numero INTEGER;
SET numero = (SELECT MAX(ITEM) FROM ordemservicocotacaoitem_hc WHERE Numero = new.Numero AND Mes = new.Mes AND Ano = new.Ano);
IF (numero <= 0) OR (numero IS NULL)THEN
SET numero = 1;
ELSE
SET numero = numero + 1;
END IF;
SET new.ITEM = numero;
END$$
DELIMITER ;$$
da o erro:
1 queries executed, 0 success, 1 errors, 0 warnings
Query: CREATE TRIGGER Orcamento_Item BEFORE INSERT ON ordemservicocotacaoitem_hc FOR EACH ROW BEGIN DECLARE numero INTEGER
Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near [ô][ô] at line 5
Execution Time : 0 sec
Transfer Time : 0 sec
Total Time : 0.006 sec
E outra duvida:
E também tenho outra duvida, preciso que ao deletar o item por exemplo tenho 10 itens, ao deletar o item 2, o 3 deve virar 2, o 4 virar 3º etc tem alguma trigger que posso utilizar pra facilitar e fazer isso automaticamente no AFTER DELETE?
Sera que é dá? na verdade a dificuldade está no delete tbm, pois se for AUTO_increment não poderei reorganizar os itens, então acredito que eu não deva usar auto_increment no ITEM
Qual a estrutura da tabela e para que ela serve?
Tem alguma outra tabela que tem relação com ela? Tipo, ela é [Ô]filha[Ô] de alguma outra?
porém esbarrei em 2 problemas:
1.[/b
[b]2. Ja tirei o AUTO_INC do ITEM da tabela orcamento_itens, pois preciso também deletar o item e [Ô]realocar[Ô] a posição dos itens subsequentes ou seja: tenho 4 itens de orçamento caso deletar o 2º item, o 3º tem que virar 2º e o 4º virar o 3º, até ai pensei em pegar a posição do item ao ser deletado, item 2 no caso, deletar ele no banco e fazer um while para que de update nos proximos itens (tipo: item = item-1).. por isso tirei o AUTO_INC do itens.. é meio estranho eu sei, porém [Ô]queridos[Ô] funcionários já estão acostumados a fazer tal procedimento e não deve-se mecher com eles pois sabe como são usuarios né? (isso na tabela orcamento_itens)
Vi que vc usa o MySql daà eu não sei muito bem como fazer. Eu uso o SqlServer e nele, isso poderia ser resolvido de três maneiras bem simples:
1 - Criar uma sequência - Veja se o MySql suporta esse recurso;
2 - Mudar o tipo item para coluna calculada e aplicar uma função que atualize o contador do item. Isso resolveria tb para os casos de exclusão de linhas;
3 - Criar uma trigguer que nas ações insert e delete atualize o teu campo Item;
Veja a opção que vc achar melhor e que o MySql suporte e me diga que te passo um código em sql server é claro, mas daà vc adapta para o mysql
Citação::
Pelo que entendi, para cada numero repetido vc precisa iniciar uma nova numeração a partir do 1 que vai crescendo para cada linha que é acrescentada.
Vi que vc usa o MySql daà eu não sei muito bem como fazer. Eu uso o SqlServer e nele, isso poderia ser resolvido de três maneiras bem simples:
1 - Criar uma sequência - Veja se o MySql suporta esse recurso;
2 - Mudar o tipo item para coluna calculada e aplicar uma função que atualize o contador do item. Isso resolveria tb para os casos de exclusão de linhas;
3 - Criar uma trigguer que nas ações insert e delete atualize o teu campo Item;
Veja a opção que vc achar melhor e que o MySql suporte e me diga que te passo um código em sql server é claro, mas daà vc adapta para o mysql
1. já resolvi utilizando last_insert_id corretamente.. tava usando no banco de dados direto kkkkkk acreditem se quiser to sob efeito de 3 remedios e trabalhando enquanto devia estar de folga mas é isso aÃ...
obs: da tabela ordemservico_itens resolvi tirar a AUTO_INC do ITEM e manter ele como INT normal..
3. Fiquei interessado, teria que fazer uma Trigger que ao deletar por exemplo item 2 ele desse um update no item de todos os meus registros que atendessem a clausula WHERE Numero=Numero AND Mes=Mes AND Ano=Ano, fazendo item=item-1... pois dai eu só teria o trabalho de fazer o DELETE FROM no projeto e a trigger se encarregaria de realizar o update dos itens.
Citação::
Pode mostrar a estrutura das tabelas?
Acho que unica solução seria tirar o AUTO_INC da ITEM devido terq fazer update alterar o item e etc e desconheço campo AUTO_INC que permita fazer update, conforme tenho que manipulá-lo conforme explicação (item 3.) então o problema foi resolvido agora o grande problema está na trigger de reorganizar os itens quando algum for deletado
Nunca fiz uma trigger desse tipo pois tenho que ler qual o ITEM deletado, e reorganizar os itens fazendo um update..
Citação::
E então, pode mostrar a estrutura das tabelas?
Opa kerp, segue aà haha..
create table 'ordemservicocotacao_hc' (
'Numero' bigint (20),
'mes' varchar (6),
'ano' varchar (12),
'Rev' int (11),
'CodCli' varchar (765),
'CodSol' varchar (765),
'Dataofe' datetime ,
'Obs' blob ,
'Pedido' varchar (135),
'DtentradaEnsaio' datetime ,
'DtprevtermEnsaio' datetime ,
'Orcamento' varchar (135),
'Situacao' varchar (135),
'NomeAceite' varchar (135),
'DataAceite' datetime ,
'Desconto' double ,
'mkCodigo' varchar (135),
'rotina' varchar (3),
'NomeUsuario' varchar (135),
'devolucao' varchar (15),
'FatSol' int (10),
'DC' int (10),
'DN' int (10),
'Repasse' double ,
'TotalGeral' double ,
'TotalCobrado' double ,
'DataLiberacao' double ,
'Cancelamento' text ,
'Cliente' varchar (765),
'Solicitante' varchar (765),
'contatoCli' varchar (765),
'setorCli' varchar (135),
'telCli' varchar (135),
'emailCli' varchar (135),
'contatoSol' varchar (765),
'setorSol' varchar (135),
'telSol' varchar (135),
'emailSol' varchar (135)
);
create table 'ordemservicocotacaoitem_hc' (
'Numero' int (10),
'Mes' varchar (30),
'Ano' int (10),
'Item' int (10),
'Rev' int (10),
'Normaos' varchar (135),
'ProdEnsaiado' varchar (765),
'Situacao' varchar (135),
'ObsItem' text ,
'QtdItem' double ,
'UnidItem' varchar (135),
'TotalItem' double ,
'Dias' int (10),
'codform101' int (10),
'CodigoEnsaio' varchar (135),
'qtdAmostra' int (10),
'DataLiberacao' datetime ,
'laboratorio' varchar (135),
'valorItem' double ,
'valorItemFinal' double ,
'valorDesc' double ,
'valorRepasse' double
);
Citação::
O campo codigo em [Ô]ordemservicocotacao_hc[Ô] é a chave primária e é único, certo?
isso certo, na verdade alterei pra Numero pra vc entender.. o Numero(Codigo) é o id auto_inc da tabela orcamento.
chave composta entre codigo,mes e ano..
codigo|mes|ano
Ou seja: 1 12 2016 é unico!!
2 [ô][ô] [ô][ô] é unico! ...