2008-09-02 15 views
7

que tienen una consulta SQL que tiene la siguiente forma:¿Cómo hago múltiples actualizaciones en una sola consulta SQL?

UPDATE foo 
SET flag=true 
WHERE id=? 

que también tienen una matriz PHP que tiene una lista de ID. ¿Cuál es la mejor manera de lograr esto sí que con el análisis sintáctico, de la siguiente manera, ...

foreach($list as $item){ 
    $querycondition = $querycondition . " OR " . $item; 
} 

... y el uso de la salida en la cláusula WHERE?

Respuesta

9

Esto sería lograr lo mismo, pero probablemente no va a ceder gran parte de un aumento de velocidad, pero se ve mejor.

mysql_query("UPDATE foo SET flag=true WHERE id IN (".implode(', ',$list).")"); 
5

usted debería ser capaz de utilizar la cláusula IN (suponiendo que ésta lo admite):

UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6)

0

no he visto alguna vez una manera de hacerlo que no sea su bucle foreach.

Pero, si $ list está de alguna manera obtenida del usuario, debe seguir utilizando la declaración preparada y simplemente actualizar una fila a la vez (suponiendo que alguien no tiene una manera de actualizar varias filas con un preparado declaración). De lo contrario, está muy abierto a la inyección sql.

1

Uso unirse/implosión hacer una lista separada por comas de terminar con:

UPDATE foo SET flag=true WHERE id IN (1,2,3,4) 
0

puede atascarle la actualización con declaraciones de casos pero tendrá que crear la consulta por su cuenta.

UPDATE foo 
SET flag=CASE ID WHEN 5 THEN true ELSE flag END 
    ,flag=CASE ID WHEN 6 THEN false ELSE flag END 
WHERE id in (5,6) 

El lugar se puede omitir pero le ahorra una actualización completa de la tabla.

0

código VB.NET: tenue delimitedIdList como secuencia = arrayToString (listOfIds)

tenue SQL como cadena = "foo bandera de actualización de SET = true donde id en (" + delimitedIdList + ")"

runSql (SQL)

5

Utilice la instrucción IN. Proporcione una lista de valores clave separados por comas. Puede hacerlo fácilmente usando la función implode.

UPDATE foo SET flag = true WHERE id IN (1, 2, 3, 4, 5, ...) 

Alternativamente, puede utilizar condición:

UPDATE foo SET flag = true WHERE flag = false 

o subconsulta:

UPDATE foo SET flag = true WHERE id IN (SELECT id FROM foo WHERE .....) 
0

Si conoce un salto en el número de artículos a continuación, utilizar la cláusula de "IN", como los demás han sugerido:

UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6) 

Una advertencia, sin embargo, es que dependiendo de su base de datos puede haber un límite en la cantidad de elementos en la cláusula. Ej. Oráculo 7 u 8 (?) solía tener un límite de 256 elementos (esto se aumentó significativamente en las versiones posteriores)
Si itera sobre una lista, use una transacción para poder deshacer si una de las actualizaciones falla

Cuestiones relacionadas