Inserir tabela MySql se não existir de outra forma atualizar

UPDATE AggregatedData SET datenum="734152.979166667", Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667"; 

Ele funciona se o datenum existir, mas quero inserir esses dados como uma nova linha se o datenum não existir.

ATUALIZAR

o datenum é único, mas essa não é a chave primária

Jai está correto que você deve usar INSERT ... ON DUPLICATE KEY UPDATE .

Observe que você não precisa include o datenum na cláusula update, já que é a chave exclusiva, portanto, ela não deve ser alterada. Você precisa include todas as outras colunas da sua tabela. Você pode usar a function VALUES() para garantir que os valores apropriados sejam usados ​​ao atualizar as outras colunas.

Aqui está a sua atualização reescrita usando a syntax adequada INSERT ... ON DUPLICATE KEY UPDATE para MySQL:

 INSERT INTO AggregatedData (datenum,Timestamp) VALUES ("734152.979166667","2010-01-14 23:30:00.000") ON DUPLICATE KEY UPDATE Timestamp=VALUES(Timestamp) 

Tente usar isso :

Se você especificar ON DUPLICATE KEY UPDATE e for inserida uma linha que causaria um valor duplicado em um UNIQUE index or PRIMARY KEY , MySQL performs an [ UPDATE`] ( http://dev.mysql.com/doc/refman/5.7 /en/update.html ) da linha antiga …

A cláusula ON DUPLICATE KEY UPDATE pode conter várias atribuições de colunas, separadas por vírgulas.

Com ON DUPLICATE KEY UPDATE , o valor de linhas afetadas por linha será 1 se a linha for inserida como uma nova linha, 2 se uma linha existente for atualizada e 0 se uma linha existente estiver configurada com seus valores atuais. Se você especificar o sinalizador CLIENT_FOUND_ROWS para mysql_real_connect() ao conectar-se ao mysqld , o valor de rows afetadas será 1 (não 0) se uma linha existente estiver configurada com seus valores atuais …

Eu tive uma situação onde eu precisava atualizar ou inserir em uma tabela de acordo com dois campos (foreign keys) em que eu não poderia definir uma restrição UNIQUE (assim INSERT … ON DUPLICATE KEY UPDATE não funcionará). Aqui está o que acabei usando:

 replace into last_recogs (id, hasher_id, hash_id, last_recog) select l.* from (select id, hasher_id, hash_id, [new_value] from last_recogs where hasher_id in (select id from hashers where name=[hasher_name]) and hash_id in (select id from hashes where name=[hash_name]) union select 0, m.id, h.id, [new_value] from hashers m cross join hashes h where m.name=[hasher_name] and h.name=[hash_name]) l limit 1; 

Este exemplo é copiado de um dos meus bancos de dados, com os parâmetros de input (dois nomes e um número) substituídos por [hasher_name], [hash_name] e [new_value]. O SELECT … LIMIT 1 nested obtém o primeiro registro existente ou um novo registro (last_recogs.id é uma chave primária de incremento automático) e o usa como input de valor no REPLACE INTO.

Intereting Posts