2012-01-24 39 views
19

Al usar insert... on duplicate key update, ¿cuál es la sintaxis para actualizar varias columnas?Actualización de clave duplicada - Varias columnas

INSERT INTO table1 (col1, col2, col3, col4) VALUES (’$val1’, ‘$val2’, ‘$val3’, ‘$val4’) 
ON DUPLICATE KEY UPDATE col2=‘$val2’, col3=‘$val3’, col4=‘$val4’ // <-- not sure 

Actualización: Estoy usando esto en PHP. Dado que esta es una pregunta de sintaxis, es muy relevante.

$result = mysql_query("INSERT INTO table1 (col1, col2, col3, col4) 
         VALUES (’$val1’, ‘$val2’, ‘$val3’, ‘$val4’) 
         ON DUPLICATE KEY UPDATE (col2=‘$val2’, col3=‘$val3’, col4=‘$val4’)") 

De nuevo, no estoy seguro acerca de esta última parte con la "Actualización".

Respuesta

0

Su consulta parece ser la correcta. Aquí está mi ejemplo de este tipo de consulta:

INSERT INTO Stat (id, month, year, views, redirects, onList, onMap, emails) VALUE ("' . $Id . '","' . $month . '","' . $year . '",0,0,"' . $data['onList'] . '","' . $data['onMap'] . '",0) ON DUPLICATE KEY UPDATE onList=onList+' . $data['onList'] . ', onMap=onMap+' . $data['onMap'] 
+0

qué es la segunda '' onList' necesaria en onList = onList +'. $ data [ 'onList']'.? ¿no es suficiente tener 'onList = $ data ['onList']'? o en mi ejemplo: 'col2 = '$ val2''? –

+0

lo que está haciendo es ligeramente diferente, está agregando $ data ['onList'] al valor del campo onList. – sathia

29
INSERT INTO table1 
    (`col1`, `col2`, `col3`, `col4`) 
VALUES 
    ('val1', 'val2', 'val3', 'val4') 
ON DUPLICATE KEY UPDATE 
    `col2`='val2', 
    `col3`='val3', [...] 

que fija sus citas y las marcas de división.

Editar:

En PHP:

$result = mysql_query(" 
    INSERT INTO table1 
     (col1, col2, col3, col4) 
    VALUES 
     ('" . $val1 . "', '" . $val2 . "', '" . $val3 . "', '" . $val4 . "') 
    ON DUPLICATE KEY UPDATE 
     col2='" . $val2 . "', 
     col3='" . $val3 . "', 
     col4='" . $val4 . "'" 
); 

Tenga en cuenta que los valores están rodeados por comillas simples '. Si los valores son un tipo de número (INT, FLOAT, etc.) puede soltar esas comillas. Los Backticks son opcionales alrededor de los nombres de las columnas siempre que no use nombres de columna como count, type o table.

En el ejemplo de PHP, la concatenación de cadenas se utiliza para separar claramente las variables.

+0

ver mi actualización, esto está dentro de script php, de ahí la sintaxis. Te agradecería si pudieras echarle un vistazo ahora. gracias –

+0

no puede usar tickmarks para valores, que están destinados a ser usados ​​con nombres de columna. usa la sintaxis que mostré en mi respuesta. funcionará. – sathia

+0

$ result = mysql_query ("INSERT INTO table1 ('col1', 'col2', 'col3', 'col4') VALUES (". $ Val1. ",". $ Val2. ",". $ Val3. ", ". $ val4.") ON DUPLICATE KEY UPDATE 'col2' = ". $ val2.", 'col3' = ". $ val3.", 'col4' = ". $ val4.") – sathia

0

En aras de una sintaxis clara, hay otra forma de sintaxis;

INSERT INTO `table1` SET `id`=$id, 
         `col2`='$col2', 
         `col3`='$col3'[, ...] 
ON DUPLICATE KEY UPDATE `col2`='$col2', 
         `col4`='$col4'[, ...] 

Ejemplo;

INSERT INTO customers SET cid=10, 
          createdon=NOW(), 
          createdby='user', 
          cname='Steve' 
    ON DUPLICATE KEY UPDATE modifiedon=NOW(), 
          modifiedby='user', 
          cname='Steve'; 

Si no existe un cliente con ID = 10 en la base de datos que será creada y columnas cid, createdon, createdby, se establecerá cname. Si existe, se actualizará y las columnas se modificarán en, se modificarábym, se actualizará cname.

NOTA # 1: SI pone aquí la clave primaria cid = 0, disparará AUTO_INCREMENT (por supuesto, si la columna pk se define como AUTO_INCREMENT) y se insertará un registro.

NOTA # 2: ON DUPLICATE KEY UPDATE realiza la actualización para el registro de ID de PK existente. Pero también actualiza si DUPLICATE se hace en cualquier columna UNIQUE KEY. Por ejemplo, si definió que la columna cname es ÚNICA, entonces guardar el registro con cname = 'Steve' que ya existe dará como resultado la ACTUALIZACIÓN de ese registro (no el nuevo INSERT). Tenga cuidado con esto porque puede esperar que DB devuelva error por violación de restricción UNIQUE KEY que no sucederá aquí.

14

Bueno, esto es viejo.Pero, por supuesto, sólo es necesario proporcionar un valor vez, no hay razón para agregar una segunda vez en la consulta (que viene muy bien para múltiples plantillas, o declaraciones preparadas):

INSERT INTO table1 
    (col1, col2, col3, col4) 
VALUES 
    ('val1', 'val2', 'val3', 'val4') 
ON DUPLICATE KEY UPDATE 
    col2=VALUES(col2) 
    col3=VALUES(col3) [,...] 

que tiene como Advantage seguirá siendo el trabajo para una instrucción de inserción múltiple:

INSERT INTO table1 
    (col1, col2, col3, col4) 
VALUES 
    ('val1', 'val2', 'val3', 'val4'), 
    ('val5', 'val6', 'val7', 'val8'), 
    ('val9', 'val10', 'val11', 'val12') 
ON DUPLICATE KEY UPDATE 
    col2=VALUES(col2) 
    col3=VALUES(col3) [,...] 
+0

Esta es la mejor respuesta, solo use My La funcionalidad de SQL que admite varias inserciones –

Cuestiones relacionadas