Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Insertar y actualizar al mismo tiempo...

Estas en el tema de Insertar y actualizar al mismo tiempo... en el foro de Mysql en Foros del Web. Hola... Tengo la siguiente tabla: Cita: +----------+-------------+-----------+--------+ | id | escuela | valor | prof | +----------+-------------+-----------+--------+ | 1 | alfa | 10.00 | A ...
  #1 (permalink)  
Antiguo 31/01/2012, 10:32
Avatar de andrewp  
Fecha de Ingreso: agosto-2003
Ubicación: Barcelona
Mensajes: 1.160
Antigüedad: 20 años, 8 meses
Puntos: 5
Pregunta Insertar y actualizar al mismo tiempo...

Hola...

Tengo la siguiente tabla:

Cita:
+----------+-------------+-----------+--------+
| id | escuela | valor | prof |
+----------+-------------+-----------+--------+
| 1 | alfa | 10.00 | A |
| 2 | beta | 30.00 | F |
| 3 | gama | 90.00 | T |
+----------+-------------+-----------+--------+
A través de un formulario de actualización, la idea es actualizar los registros que ya existen e insertar los que no esten en la base de datos.

Así, si el usuario quiere modificar el id #2 y el id #1 con un nuevo valor de 20.00 y 55.00 respectivamente y al mismo tiempo agregar el id #4 e id #5 con sus respectivos valores, la tabla debería quedar así:

Cita:
+----------+-------------+-----------+--------+
| id | escuela | valor | prof |
+----------+-------------+-----------+--------+
| 1 | alfa | 20.00 | A |
| 2 | beta | 55.00 | F |
| 3 | gama | 90.00 | T |
| 4 | lamb | 35.00 | N |
| 5 | epsil | 80.00 | E |
+----------+-------------+-----------+--------+
Lo he probado con la opción:
Código PHP:
$query "INSERT INTO tabla (id, escuela, valor, prof) VALUES ('', '$escuela', ".$valor', '$prof') ON DUPLICATE KEY UPDATE id='', escuela='$escuela', valor='$valor', prof='$prof
Pero no me funciona y me modifica sólo el último registro de manera incoherente.

Sabéis comopuedo usar el INSERt INTO ON DUPLICATE KEY UPDATE?

Gracias!
__________________
Andrew :P
  #2 (permalink)  
Antiguo 31/01/2012, 13:56
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Insertar y actualizar al mismo tiempo...

Hola andrewp:

El problema puede estar por la manera en que estás definiendo tu tabla, pues no nos dices nada a ese respecto, una correcta definición de llaves e índices es promordial para el buen funcionamiento de la cláusula ON DUPLICATE KEY.

Observa este ejemplo, la tabla tiene un campo llave autoincremental (ID) y un campo único (escuela), hay que recordar que son dos cosas muy distintas campos PRIMARY KEY y UNIQUE. La definición de la tabla quedaría así:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE `pruebas`.`tabla`
  2.     -> `escuela` VARCHAR(15) NOT NULL,
  3.     -> `valor` NUMERIC (5,2) NOT NULL,
  4.     -> `prof` VARCHAR(1),
  5.     -> PRIMARY KEY (`id`),
  6.     -> UNIQUE(`escuela`)
  7.     -> );
  8. Query OK, 0 rows affected (0.31 sec)
  9.  
  10. mysql> #insertamos tres registros distintos
  11. mysql> INSERT INTO tabla VALUES
  12.     -> (NULL, 'alfa', 10.00, 'A'),
  13.     -> (NULL, 'beta', 30.00, 'F'),
  14.     -> (NULL, 'gama', 90.00, 'T');
  15. Query OK, 3 rows affected (0.04 sec)
  16. Records: 3  Duplicates: 0  Warnings: 0
  17.  
  18. mysql> SELECT * FROM tabla;
  19. +----+---------+-------+------+
  20. | id | escuela | valor | prof |
  21. +----+---------+-------+------+
  22. |  1 | alfa    | 10.00 | A    |
  23. |  2 | beta    | 30.00 | F    |
  24. |  3 | gama    | 90.00 | T    |
  25. +----+---------+-------+------+
  26. 3 rows in set (0.00 sec)

Ahora bien, veamos con este script si se entiende cómo funciona la cláusula ON DUPLICATED KEY;

Código MySQL:
Ver original
  1. mysql> #insertamos tres registros:
  2. mysql> #'delta' es un registro nuevo, se INSERTA,
  3. mysql> #'alfa' es un registro duplicado por UNIQUE, se ACTUALIZA
  4. mysql> #'otra beta' es un registro duplicado por PRIMARY KEY, se ACTUALIZA
  5. mysql> INSERT INTO tabla (id, escuela, valor, prof) VALUES
  6.     -> (NULL, 'delta', 70.00, 'A'),
  7.     -> (NULL, 'alfa', 70.00, 'A'),
  8.     -> (2, 'otra beta', 70.00, 'A')
  9.     -> ON DUPLICATE KEY UPDATE  valor=999.00, prof='Z';
  10. Query OK, 5 rows affected (0.03 sec)
  11. Records: 3  Duplicates: 2  Warnings: 0
  12.  
  13. mysql> SELECT * FROM tabla;
  14. +----+---------+--------+------+
  15. | id | escuela | valor  | prof |
  16. +----+---------+--------+------+
  17. |  1 | alfa    | 999.00 | Z    |
  18. |  2 | beta    | 999.00 | Z    |
  19. |  3 | gama    |  90.00 | T    |
  20. |  4 | delta   |  70.00 | A    |
  21. +----+---------+--------+------+
  22. 4 rows in set (0.00 sec)

Observa que el registro 4 se insertó, mientras que los registros 1 y 2 se actualizaron.

Dale un vistazo a ver si queda claro, si tienes problemas postea el script de creación de tu tabla para tratar de ayudarte.

Saludos
Leo.
  #3 (permalink)  
Antiguo 31/01/2012, 15:31
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Insertar y actualizar al mismo tiempo...

Hola andrewp:

El problema puede estar por la manera en que estás definiendo tu tabla, pues no nos dices nada a ese respecto, una correcta definición de llaves e índices es promordial para el buen funcionamiento de la cláusula ON DUPLICATE KEY.

Observa este ejemplo, la tabla tiene un campo llave autoincremental (ID) y un campo único (escuela), hay que recordar que son dos cosas muy distintas campos PRIMARY KEY y UNIQUE. La definición de la tabla quedaría así:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE `pruebas`.`tabla`
  2.     -> `escuela` VARCHAR(15) NOT NULL,
  3.     -> `valor` NUMERIC (5,2) NOT NULL,
  4.     -> `prof` VARCHAR(1),
  5.     -> PRIMARY KEY (`id`),
  6.     -> UNIQUE(`escuela`)
  7.     -> );
  8. Query OK, 0 rows affected (0.31 sec)
  9.  
  10. mysql> #insertamos tres registros distintos
  11. mysql> INSERT INTO tabla VALUES
  12.     -> (NULL, 'alfa', 10.00, 'A'),
  13.     -> (NULL, 'beta', 30.00, 'F'),
  14.     -> (NULL, 'gama', 90.00, 'T');
  15. Query OK, 3 rows affected (0.04 sec)
  16. Records: 3  Duplicates: 0  Warnings: 0
  17.  
  18. mysql> SELECT * FROM tabla;
  19. +----+---------+-------+------+
  20. | id | escuela | valor | prof |
  21. +----+---------+-------+------+
  22. |  1 | alfa    | 10.00 | A    |
  23. |  2 | beta    | 30.00 | F    |
  24. |  3 | gama    | 90.00 | T    |
  25. +----+---------+-------+------+
  26. 3 rows in set (0.00 sec)

Ahora bien, veamos con este script si se entiende cómo funciona la cláusula ON DUPLICATED KEY;

Código MySQL:
Ver original
  1. mysql> #insertamos tres registros:
  2. mysql> #'delta' es un registro nuevo, se INSERTA,
  3. mysql> #'alfa' es un registro duplicado por UNIQUE, se ACTUALIZA
  4. mysql> #'otra beta' es un registro duplicado por PRIMARY KEY, se ACTUALIZA
  5. mysql> INSERT INTO tabla (id, escuela, valor, prof) VALUES
  6.     -> (NULL, 'delta', 70.00, 'A'),
  7.     -> (NULL, 'alfa', 70.00, 'A'),
  8.     -> (2, 'otra beta', 70.00, 'A')
  9.     -> ON DUPLICATE KEY UPDATE  valor=999.00, prof='Z';
  10. Query OK, 5 rows affected (0.03 sec)
  11. Records: 3  Duplicates: 2  Warnings: 0
  12.  
  13. mysql> SELECT * FROM tabla;
  14. +----+---------+--------+------+
  15. | id | escuela | valor  | prof |
  16. +----+---------+--------+------+
  17. |  1 | alfa    | 999.00 | Z    |
  18. |  2 | beta    | 999.00 | Z    |
  19. |  3 | gama    |  90.00 | T    |
  20. |  4 | delta   |  70.00 | A    |
  21. +----+---------+--------+------+
  22. 4 rows in set (0.00 sec)

Observa que el registro 4 se insertó, mientras que los registros 1 y 2 se actualizaron.

Dale un vistazo a ver si queda claro, si tienes problemas postea el script de creación de tu tabla para tratar de ayudarte.

Saludos
Leo.

Etiquetas: query, registros, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:05.