WPDB Insertar o Actualizar si existe

20 may 2014, 23:14:22
Vistas: 76.2K
Votos: 32

No estoy muy familiarizado con WPDB o SQL en general, pero tengo una tabla personalizada para mi proyecto y estoy tratando de asignarle algunos metadatos. Lo que me "gustaría" que sucediera es que si existe una fila, se actualice y si no, se inserte. He leído tanto Insert como Update en el Codex de WPDB, pero ninguno profundizó realmente en una situación de "uno u otro". Pensé que podría trabajar con update, así que mi código hasta ahora se ve así:

$wpdb->update(
    $wpdb->prepare(
        $wpdb->prefix.'item_info',
        array(
            'post_id'       => $post_id,
            'item_stock'    => $item_stock
        ),
        array('post_id' => $post_id)
    )
);

¿WordPress tiene algo como "SI existe Actualizar, SI NO Insertar", o necesito ejecutar SQL personalizado para lograr esto, o necesito consultar primero la base de datos para ver si existe un ID en mi tabla y LUEGO decidir si actualizarlo o insertarlo?

0
Todas las respuestas a la pregunta 5
6
37

¿Has probado $wpdb->replace? Según el WP Codex:

Reemplaza una fila en una tabla si existe o inserta una nueva fila si la fila no existía previamente.

Lo he probado yo mismo en algunos plugins y funciona cuando intentas evitar errores de duplicación de IDs únicos, etc.

Más información en el codex

5 sept 2014 02:39:12
Comentarios

Esto funcionó para mí mientras que la consulta personalizada no lo hizo - gracias por mencionar replace()

trainoasis trainoasis
25 ene 2016 10:49:02

Esta es la respuesta correcta a la pregunta.

Tyler Jones Tyler Jones
20 sept 2016 12:19:55

vale la pena mencionar que $wpdb->replace es una sobrescritura destructiva de todo el registro, mientras que $wpdb->update solo actualiza los campos específicos incluidos en el arreglo $data

MatthewLee MatthewLee
9 dic 2016 06:46:55

Esta función no está haciendo el reemplazo por mí en este momento. Duplica las mismas filas. ¿Puede ser que un campo PRIMARY KEY (id) sea la causa que impide que ocurra el reemplazo? No encuentro información sobre esto en el Codex.

Viktor Borítás Viktor Borítás
14 may 2020 19:54:46

Lo resolví: Para mitigar este problema de reemplazo, también es necesario aplicar la restricción UNIQUE a columnas específicas al crear la tabla, haciendo así posibles filas únicas.

Viktor Borítás Viktor Borítás
14 may 2020 20:12:02

@ViktorBorítás - ¿o más bien imposibles las filas duplicadas?

Kropotkin Kropotkin
29 jun 2023 13:53:54
Mostrar los 1 comentarios restantes
3
32

Primero, estás usando prepare incorrectamente. Parece que tienes los argumentos de $wpdb->update envueltos en $wpdb->prepare de esa manera. Eso no funcionará. En efecto, le estás pasando a update un solo argumento: la salida de prepare. Prueba algo simple como lo siguiente y verás por qué no funcionará:

$post_id = 123;
$item_stock = 567;
var_dump(
  $wpdb->prepare(
    $wpdb->prefix.'item_info',
    array(
        'post_id'       => $post_id,
        'item_stock'    => $item_stock
    ),
    array('post_id' => $post_id)
  )
);

Y $wpdb->update() ejecuta prepare por ti.

Segundo, si fuera yo, omitiría las funciones auxiliares redundantes y escribiría una consulta adecuada con ON DUPLICATE KEY UPDATE:

$sql = "INSERT INTO {$wpdb->prefix}item_info (post_id,item_stock) VALUES (%d,%s) ON DUPLICATE KEY UPDATE item_stock = %s";
// var_dump($sql); // depuración
$sql = $wpdb->prepare($sql,$post_id,$item_stock,$item_stock);
// var_dump($sql); // depuración
$wpdb->query($sql);

Esto asume que post_id es un UNIQUE index o PRIMARY KEY. Si la estructura de tu tabla es lo que creo que es, deja que la base de datos lo maneje.

21 may 2014 16:09:45
Comentarios

Esto fue increíblemente útil... ¡Gracias por tu tiempo s_ha_dum!

Jake Jake
30 jul 2014 18:01:56

Prepare me devuelve false - sin otros errores de base de datos. Si ejecuto la consulta manualmente en phpmyadmin, funciona como se espera. También verifiqué que las variables son lo que deberían ser... ¿Alguna idea?

trainoasis trainoasis
25 ene 2016 10:37:27

¿Qué pasa si post_id no es la PRIMARY KEY?

Mike Kormendy Mike Kormendy
29 nov 2016 02:36:02
1

Puedes intentar actualizar la tabla usando $wpdb->update, estoy usando el id en el siguiente código, pero puedes usar cualquier criterio.

$result = $wpdb->update($tableName, $info, array('id' => $info["id"]));
//Si no encuentra nada para actualizar, intentará crear el registro.
if ($result === FALSE || $result < 1) {
    $wpdb->insert($tableName, $info);
}

Resultados posibles de Update()

  • $result === FALSE : Fallo
  • $result === 0 : Éxito, pero no se actualizó nada
  • $result > 1: Éxito y se actualizó
17 jun 2021 21:18:40
Comentarios

Si los valores son iguales, MySQL no actualizará la fila, por lo que el conteo de filas afectadas será 0.

Darrel K. Darrel K.
8 oct 2021 09:28:48
1
-1

Deberías verificar primero si la fila existe.

Lo más probable es que quieras intentar obtener el ID o la clave primaria de la fila que estás intentando actualizar, luego usar $wpdb->update si existe o $wpdb->insert si no existe.

20 may 2014 23:40:08
Comentarios

Un ejemplo de cómo verificar si el ID o la clave primaria existe realmente haría de esta una respuesta útil. Esto es casi como reiterar la pregunta.

Jake Jake
30 jul 2014 17:57:12
1
-1

usa $wpdb->insert, $wpdb->insert puede insertar y actualizar también.. EN 2023

EDITADO $wpdb->insert no actualiza la fila, usa $wpdb->replace

20 nov 2023 14:20:25
Comentarios

Una distinción importante a tener en cuenta es que wpdb::replace() sí elimina y luego inserta si se encuentra un duplicado - no realiza un wpdb::update(), lo cual debe considerarse según el caso de uso.

Howdy_McGee Howdy_McGee
20 nov 2023 21:29:54