Insertar tabla MySQL si no existe de lo contrario actualizar


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

Funciona si el datenum existe, pero quiero insertar estos datos como una nueva fila si el datenum no existe.

ACTUALIZAR

El datenum es único pero esa no es la clave primaria

Author: OHLÁLÁ, 2011-05-17

3 answers

Jai es correcto que usted debe utilizar INSERT ... ON DUPLICATE KEY UPDATE.

Tenga en cuenta que no necesita incluir datenum en la cláusula update ya que es la clave única, por lo que no debe cambiar. Es necesario incluir todas las demás columnas de la tabla. Puede utilizar el VALUES() función para asegurarse de que se utilizan los valores adecuados al actualizar las otras columnas.

Aquí está su actualización reescrita usando la sintaxis INSERT ... ON DUPLICATE KEY UPDATE apropiada para MySQL:

INSERT INTO AggregatedData (datenum,Timestamp)
VALUES ("734152.979166667","2010-01-14 23:30:00.000")
ON DUPLICATE KEY UPDATE 
  Timestamp=VALUES(Timestamp)
 117
Author: Ike Walker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-17 20:30:06

Intenta usar esto :

Si especifica ON DUPLICATE KEY UPDATE, y se inserta una fila que causaría un valor duplicado en una CLAVE PRIMARIA UNIQUE index or , MySQL performs an [ UPDATE'] ( http://dev.mysql.com/doc/refman/5.7/en/update.html ) de la fila anterior...

La cláusula ON DUPLICATE KEY UPDATE puede contener asignaciones de varias columnas, separadas por comas.

Con ON DUPLICATE KEY UPDATE, el valor de las filas afectadas por fila es 1 si la fila se inserta como una nueva fila, 2 si se actualiza una fila existente y 0 si se la fila existente se establece en sus valores actuales. Si especifica el indicador CLIENT_FOUND_ROWS para mysql_real_connect() cuando se conecta a mysqld, el valor de las filas afectadas es 1 (no 0) si una fila existente se establece en sus valores actuales...

 14
Author: Jai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-24 20:08:27

Tuve una situación en la que necesitaba actualizar o insertar en una tabla de acuerdo con dos campos (ambas claves foráneas) en los que no podía establecer una restricción ÚNICA (así que INSERTAR ... EN LA ACTUALIZACIÓN DE CLAVE DUPLICADA no funcionará). Esto es lo que terminé 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 ejemplo se extrae de una de mis bases de datos, con los parámetros de entrada (dos nombres y un número) reemplazados por [hasher_name], [hash_name] y [new_value]. La SELECCIÓN anidada...LIMIT 1 extrae el primero del registro existente o un nuevo récord (last_recogs.id es una clave primaria autoincremento) y utiliza que como la entrada de valor en el REEMPLAZAR EN.

 0
Author: salfter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-08 19:12:02