Ir para conteúdo

Arquivado

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

Mário Monteiro

[Resolvido] sintaxe correta para inserir um registro apenas se ex

Recommended Posts

Qual seria a sintaxe correta para inserir um registro apenas se existir outro

 

Exemplo

 

Inserir em uma tabela de meses o mes de outubro somente se o de setembro já existir?

 

Ou seja a instrução seria sempre executada mas somente iria inserir se esta condição fosse verdadeira já

Compartilhar este post


Link para o post
Compartilhar em outros sites

sem usar proc, eu soh consegui pensar em um jeito dando erro

 

insert into taba (dia)

select distinct if(tem_o_mes = 1,20101001 ,Null)

from

(

select 1 as tem_o_mes

from taba

where date_format(dia,'%Y%m') = 201009

)z

 

 

e o campo dia teria q ser not null...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que uma trigger de before insert que verificasse a existência do registro e gerasse um erro caso a condição não fosse antendida também poderia resolver.

 

Mas a trigger teria de ser apenas de INSERT pois de UPDATE não poderia pois estaria lendo a mesma tabela e daria erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

giesta o campo não é not null

 

Mas é de INSERT mesmo Motta, tem como explicar melhor

 

Teria que ser preferencialmente só via SQL mesmo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Inserir em uma tabela de meses o mes de outubro somente se o de setembro já existir?

 

Não conheço a síntaxe mas :

 

trigger de before insert na tabela xpto - para cada linha (for each row)

 

passo 1 - obter o mês anterior ao mês do registro inserido

 

passo 2 - faz um select do tipo select count(*) from xpto where ref = ref_anterior(passo 1)

__________se count(*) > 0

______________então gera um erro com a mensagem "não existe registro de mês anterior"

 

Não vejo maneira melhor de fazer isto, um problema pode vir a ser esta checagem a cada insert pois se a tabela for grande e não tiver um índice

por data por ficar lento.

 

Uma solução seria ter uma tabela de parametros, esta tabela teria apenas um registro e guardaria a última referência válida, este campo também poderia ser alimentado por trigger e a leitura não seria lenta pois seria só um registro.

 

Esta tabela também poderia ser usado para outros parametros do Sistema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

motta não precisa saber qual o mes anterior

 

isso eu vou passar na sql

 

preciso só que apenas insira se ja estiver

 

seria tipo assim

 

INSERT INTO TABELA (CAMPO) VALUES (VALOR_A) SE VALOR_B EXISTIR EM CAMPO

 

Ou seja eu vou inserir o valor A se o cmapo já tiver um valor B, não precisaria calcular nada, tomara que fique mais simples

 

Ela não seria usada muitas vezes, talvez uma vez por semana, então a lentidão não afetará muito

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isto poderia ser feito por uma check constraint, mas pelo pouco que pesquisei o MYsql não parece ter isto, tem set e enum constraints, mas estas paracem não permitir a validação com outra coluna da tabela.

 

A ideia da trigger ainda vale :

 

trigger de before insert na tabela xpto - para cada linha (for each row)

 

passo 1 - verifica se valor_b é nulo

 

passo 2 - se valor_b é nulo

______________então gera um erro com a mensagem "não existe registro de mês anterior"

 

Mas você quer ignorar o insert ou dar erro ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

basta ignorar

 

se não existir não faz nada e se existir insere

Compartilhar este post


Link para o post
Compartilhar em outros sites

tenho q parar de beber, é logico q da...

 


insert into tabela (ref_mes)
select distinct 201010
from tabela
where ref_mes = 201009

se nao houver a referencia ele traz um resultset vazio q nao insere nada na tabela....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ei giesta, bom não funcionou exatamente como eu queria

 

Acontece que ao passar o problema aqui tentei simplificar o modelo para facilitar os auxilios mas na verdade preciso comparar mais campos

 

Teria que inserir varios campos mas antes precisava ver se existe um outro registro com varios campos

 

Creio que fazendo com 3 campos de para expandir para o desejado depois

 

Seria algo como

 

INSERT INTO TABELA (CAMPO1, CAMPO2, CAMPO3) VALUES (VALOR1, VALOR2, VALOR3) SE EXISTIR UM REGISTRO COM CAMPO1 = VALOR1, CAMPO2 = VALOR2, CAMPO3 = OUTROVALOR

 

Só o campo 3 que receberia um valor diferente os outros dois campos seriam com valores repetidos do registro que faço a comparação

 

Alem disso se o registro que quero inserir ja tiver sido inserido ele não deveria inserir novamente mas isso é um pouco menos importante e poderia ficar para outro estagio

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se entendi bem o problema, tente fazer um exemplo do tipo "chinês".

 

Outra coisa , já pensou em chamar uma Stored Procedure ao invés do Insert, dentro da SP seria possível fazer todos os tratamentos antes do INSERT em si.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ueh, mas mario, eh normal....

 

INSERT INTO TABELA (CAMPO1, CAMPO2, CAMPO3) 
select 'VALOR1', 'VALOR2', 'VALOR3'
from tabela
where CAMPO1 = 'VALOR1'
and CAMPO2 = 'VALOR2'
and CAMPO3 = 'OUTROVALOR'

e se o registro ja tiver sido inseriodo a chave primaria ou constraint unique trata de bloquear a linha entrante

Compartilhar este post


Link para o post
Compartilhar em outros sites

giesta mas esta sua query só vai inserir se o select retornar alguma coisa, se o registro não existe não retorna nada e não insere nada por consequência.

 

Insert não tem where, naõ tem como fazer o que você quer Mário.

 

1) Faça uma SP e esta faz os tratametos e insere ou não, a única solução "via Banco" que vejo.

 

e/ou

 

2) Use constraints/triggers para impedir registros sem consistência.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas Motta, acho q eh isso memso q o Mario quer

 

Ou seja a instrução seria sempre executada mas somente iria inserir se esta condição fosse verdadeira já

 

 

e tipo ... insert pode ter where desde q os valores venham de outro select e nao do values... (q foi o q eu fiz :P )

Compartilhar este post


Link para o post
Compartilhar em outros sites

giesta testarei com calma espero que funcione

Compartilhar este post


Link para o post
Compartilhar em outros sites

Funcionou perfeito giesta

 

Agora é só ajeitar exatamente como quero mas o esqueleto ta pronto

 

Já ta inserindo quando tem o registro e se não tiver não faz nada como planejado

 

Obrigado aos dois, me ajudaram muito

 

----------

 

Editado:

 

Pessoal já está 99,9 % se não der para fazer o que pretendo agora tudo bem

 

O gran finale seria adicionar a query acima do giesta mais um condicional para que não insira duplicado ou seja se a query já inseriu ela não insira denovo, lembrando que os valores a serem inseridos eu defino na propria query

 

INSERT INTO TABELA (CAMPO1, CAMPO2, CAMPO3)

select 'VALOR1', 'VALOR2', 'VALOR3'

from tabela

where CAMPO1 = 'VALOR1'

and CAMPO2 = 'VALOR2'

and CAMPO3 = 'OUTROVALOR'

No caso aqui seria como se fosse o CAMPO3, se tiver meu VALOR3 não insira denovo

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mario, uma constraint unique ou um primary key resolve isso pra você. (afinal eh pra isso q elas servem, evitar repetiçao) Alem disso um 'DISTINCT' antes para nao repetir linhas inteiras tambem ajudaria.

 

Ai partindo do principio q existe a chave você pode usar uma variaçao do insert chamado 'INSERT IGNORE' q simplesmente ignora e silenciosamente continua a rodar caso ocorra um conflito de chaves (a chave entrante ja existe), mantendo a chave mais antiga na tabela e ignorando a entrante, outra variaçao eh o 'REPLACE' faz justamente o contrario ele atualiza a linha para os valores da entrante e joga fora os valores velhos.

 

 

 

http://dev.mysql.com/doc/refman/5.0/en/replace.html

http://dev.mysql.com/doc/refman/5.0/en/insert.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas poderia repetir os valores, apenas neste caso especifico é que não queria que fizesse

 

vou deixar assim por hora

 

obrigado

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.