Ir para conteúdo

POWERED BY:

Arquivado

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

DaniloTec

Replace Into, Para inserir e atualizar

Recommended Posts

Boa tarde a todos.

 

Estou com o seguinte problema:

Tenho uma base de dados em SQL Server que tem que ser "clonada" para outra base de dados MySql da seguinte forma:

Se tiver o registro

-Atualizar

Senão

-Inserir

 

Eu vi que no MySql tem um comando chamado REPLACE INTO que resolve esse problema com um só comando. Ao montar a string de REPLACE ele insere os dados norlammente, porém, quando ela roda novamente ela não atualiza nenhum dado, ela simplesmente insere os dados duplicando a tabela.

 

A string ficou da seguinte forma:

 

replace into cadastro_ocomon (usuario,login,email) values ('" & apelido & "','" login & "','" email"')
Sabem o que está acontecendo?!?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O REPLACE INTO somente substituirá dados quando houver violação de chaves, ou seja, se você definir estrategicamente um íncice na tabela alvo do comando, ele substituirá os valores e não repetirá nenhuma linha, de acordo com a chave-primária definida, por exemplo. Veja o que não poderá repitir que ele não somará e sim, irá inserir somente.

 

Muito cuidado pois em algumas situação, o REPLACE poderá ser um DELETE seguido por um INSERT.

 

Na melhor das hipóteses, Stored Procedure...com ela você terá como checar se a tupla já existe ou não para tomar uma decisão, se atualiza ou insere.

 

Abração, DEUS Abençõe!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usando o INSERT mesmo! Veja abaixo:

 

Se você especificar se uma cláusula ON DUPLICATE KEY UPDATE (noca no MySQL 4.1.0), e uma linha que causasse a duplicação de um valor fosse inserida em uma chave PRIMARY ou UNIQUE, um UPDATE da linha antiga seria realizado. Por exemplo, o comando:

mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
	-> ON DUPLICATE KEY UPDATE c=c+1;

no caso da coluna a ser declarada como UNIQUE e ja existir o valor 1, o exemplo acima seria idêntico a 

mysql> UPDATE table SET c=c+1 WHERE a=1;

Nota: se a coluna b também for única, o comando UPDATE seria escrito como 

mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

e se a=1 OR b=2 casasse com diversas linhas, somente uma linha será atualizada! em geral, deve-se tentar evitar utilizar a cláusula ON DUPLICATE KEY em tabelas com múltiplas chaves UNIQUE. Desde o MySQL 4.1.1 pode-se utilizar a função VALUES(nome_coluna) para se referir ao valor da coluna na parte INSERT do comando INSERT ... UPDATE - que é o valor que seria inserido se não houvesse conflitos de chaves duplicadas. Esta função é especialmente útil em inserções de múltiplas linhas. Naturalmente a função VALUES() só tem sentido em um comando INSERT ... UPDATE e retorna NULL no caso de outros comandos. Exemplo: 

mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
	-> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(B);

O camondo acima e idêntico a 

mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
	-> ON DUPLICATE KEY UPDATE c=3;

mysql> INSERT INTO table (a,b,c) VALUES (4,5,6)
	-> ON DUPLICATE KEY UPDATE c=9;

A utilizar ON DUPLICATE KEY UPDATE, a opção DELAYED é ignorada.

 

 

Boa!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala povo,

 

venho ressuscitar esse tópico com o seguinte SQL:

 

INSERT INTO table(
		id,
		user,
		data,
		trafego
		) VALUES 
('3','1','2012-11-22','1'), ('1','2','2012-11-22','5')
ON DUPLICATE KEY UPDATE trafego = XXX

 

A questão é que esse SQL é gerado automaticamente, tem muitas linhas de values, e são geradas em um loop.

Quero atualizar o ítem trafego quando o usuário já existir na table, mas não encontro uma maneira de fazer isso.

 

O comando REPLACE funciona, porém, ele deleta e insere um novo item na table com isso gerando um novo id(o que não é desejado no momento).

 

Alguém pode ajudar?

 

Abç

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvez com uma trigger.

 

Vlw pela dica.

Eu não sei se entendi direito, mas com TRIGGER durante o InSERT ele vai somar tudo né?!

Na verdade eu preciso que ele pegue o valor atual do tráfego e substitua pelo novo valor, isso somente para o

usuário X.

 

CREATE TRIGGER up_trafego BEFORE INSERT ON table FOR EACH ROW SET @trafego = NEW.trafego;

 

Eu criei o trigger, porém, ele dá como "duplicated entry"...

 

Ainda não foi dessa vez...

 

Alguma sugestão?

 

Abç

Compartilhar este post


Link para o post
Compartilhar em outros sites

+OU- ISTO ...

 

CREATE TRIGGER up_trafego 
AFTER INSERT ON table 
FOR EACH ROW 
UPDATE TRAFEGO SET VALOR = NEW.VALOR
WHERE CHAVE = NEW.CHAVE;

Compartilhar este post


Link para o post
Compartilhar em outros sites

É realmente com trigger não funcionou.

 

Ele até salvava a trigger, mas, na hora de executar dizia que não podia fazer o update pq o command trigger já tem update incluso.

 

acabei fazendo um outra torina para id's que já existiam no bd. Isso é temporário, pq imagina quando BD tiver milhares de registros...

 

Se alguém puder dar mais uma ajuda, agradeço.

Agradeço também a quem já ajudou!!!

 

Abç

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.