2011-05-17 26 views
71
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.MySql Insertar tabla si no existe otra manera actualizar

ACTUALIZACIÓN

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

+1

¿Es "datenum" único? Puede usar [INSERTAR ... EN ACTUALIZACIÓN DUPLICADA DE LLAVE] (http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html) si es así. – Jacob

+1

Posible duplicado de [Insertar en una tabla MySQL o actualización si existe] (http://stackoverflow.com/questions/4205181/insert-into-a-mysql-table-or-update-if-exists) –

Respuesta

106

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

Tenga en cuenta que no necesita incluir datenum en la cláusula de actualización ya que es la clave única, por lo que no debería cambiar. Necesita incluir todas las otras columnas de su tabla. Puede usar la función VALUES() para asegurarse de que se usan los valores adecuados al actualizar las otras columnas.

Aquí está su actualización reescrito utilizando la sintaxis correcta 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) 
+11

Tenga cuidado al usar INSERTAR ... EN LA ACTUALIZACIÓN DE LLAVE DUPLICADA en las tablas en una tabla que tenga más de una clave única o primaria. Tomado de [documentación de MySQL] (http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html): _En Además, a partir de MySQL 5.5.24, un INSERT ... EN La instrucción DUPLICATE KEY UPDATE contra una tabla que tiene más de una clave única o primaria también está marcada como insegura. (Bug # 11765650, Bug # 58637) _ Bug 58637 Descripción http://bugs.mysql.com/bug.php?id=58637 – broadband

+1

Podría ser necesaria para crear '' restricción UNIQUE' para Timestamp' mediante el uso de 'ALTER TABLE AggregatedData ADD UNIQUE (Timestamp) ' – Avyakt

13

Trate de usar this:

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

The 0 La cláusulapuede contener varias asignaciones de 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 una fila existente se configura con sus valores actuales. Si se especifica la bandera CLIENT_FOUND_ROWS a mysql_real_connect() cuando se conecta a mysqld, el valor de registros afectados es de 1 (no 0) si una fila existente está configurado con los valores actuales ...

+0

Pero mi datenum no es la clave principal. –

+0

Eso no es obligatorio ... el único requisito es una clave única. – Jai

+0

Entonces, en mi caso, cuál es la solución, probé esta, sin ninguna solución: INSERT INTO forwind.aggregateddata (datenum, Timestamp, Min_F1_baro_20_) VALUES ('1', '2', '3') ACTUALIZACIÓN DE LLAVE DUPLICADA datenum = datenum; –

0

que tenía una situación en la que necesitaba para actualizar o insertar en una tabla según dos campos (ambas claves foráneas) en que no pude establecer una restricción ÚNICA (por lo que INSERTAR ... EN ACTUALIZACIÓN DE LLAVE 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 cribbed de una de mis bases de datos, con los parámetros de entrada (dos nombres y un número) sustituidas con [hasher_name], [hash_name] y [nuevo_valor]. El SELECT anidado ... LIMIT 1 extrae el primero del registro existente o de un nuevo registro (last_recogs.id es una clave primaria de autoincrement) y lo utiliza como el valor ingresado en REPLACE INTO.

Cuestiones relacionadas