como reemplazo un registro en una db?

(1/2) > >>

Cergath:
pues tengo un registro, que se replica en muuuchas partes de la base de datos, miles de veces.... deseo cambiar ese registro en todas las tablas y demás... como lo podría hacer?... no veo que con phpmyadmin pueda...

^Tifa^:
Es el unico registro que se miles de veces en ese mismo campo? o hay mas que se repiten en ese mismo campo????

Si es 1 registro que se repite miles de veces en ese mismo campo, algo como esto podria servirte:

Código
 
mysql> SELECT * FROM Respuesta;
+------------+--------+--------------------------------------+
| id_usuario | id_res | respuesta                            |
+------------+--------+--------------------------------------+
|          1 |      1 | Es blanco por su iluminacion interna |
|          1 |      1 | Entonces porque cambia a amarillo    |
|          1 |      1 | por efecto de alejacion              |
|          2 |      2 | por la gravedad                      |
|          2 |      2 | Por la densidad                      |
+------------+--------+--------------------------------------+
5 ROWS IN SET (0.00 sec)  
 
mysql> UPDATE Respuesta SET id_usuario = 22 WHERE id_usuario < 2;
Query OK, 3 ROWS affected (0.00 sec)
ROWS matched: 3  Changed: 3  Warnings: 0
 
mysql> SELECT * FROM Respuesta;
+------------+--------+--------------------------------------+
| id_usuario | id_res | respuesta                            |
+------------+--------+--------------------------------------+
|         22 |      1 | Es blanco por su iluminacion interna |
|         22 |      1 | Entonces porque cambia a amarillo    |
|         22 |      1 | por efecto de alejacion              |
|          2 |      2 | por la gravedad                      |
|          2 |      2 | Por la densidad                      |
+------------+--------+--------------------------------------+
5 ROWS IN SET (0.00 sec)
 
 

Resumido : UPDATE TABLA SET CAMPO = VALOR WHERE CAMPO < 2;

Asi todos los registros de ese campo que se repitan mas de 2 veces hacia adelante seran todos sustituidos por el valor nuevo que le asignes.

Cergath:
:( el problema es que el valor que quiero cambiar puede estar en cualquier parte, no solo en "id_usuario" por ejemplo.. ¿como podría hacer para que busque en todas partes ese valor?

^Tifa^:
vaya...

El problemita aca entonces Cergath es que para buscar en una tabla cualquier registro, siempre debes anteponer un predicado especificando el campo donde haras esa busquedad. Por ejemplo, no es posible hacer una consulta de este estilo en el SQL general:

Código
   SELECT * FROM TABLE WHERE * = VALOR  

En respuesta a tu pregunta, quieres buscar un valor en toda una tabla? tendras que asignar dicho valor a buscar a cada uno de los campos de la tabla o tablas en la cual estas realizando la busquedad.

Mas o menos asi:

Código
mysql> SELECT * FROM Respuesta WHERE id_usuario = 22 AND id_res = 22;
 

Para que busque campo por campo donde exista ese valor, por ejemplo:

Código
 
mysql> SELECT * FROM Respuesta;
+------------+--------+--------------------------------------+
| id_usuario | id_res | respuesta                            |
+------------+--------+--------------------------------------+
|         22 |      1 | Es blanco por su iluminacion interna |
|         22 |      1 | Entonces porque cambia a amarillo    |
|         22 |      1 | por efecto de alejacion              |
|          2 |      2 | por la gravedad                      |
|          2 |      2 | Por la densidad                      |
|          3 |      2 | bla bla                              |
|          3 |      2 | bla bla                              |
|          3 |      2 | bla bla                              |
|          3 |      2 | bla bla                              |
+------------+--------+--------------------------------------+
9 ROWS IN SET (0.00 sec)
 
mysql> SELECT * FROM Respuesta WHERE id_usuario = 3 AND id_res = 2 HAVING(id_usuario) > 2;
+------------+--------+-----------+
| id_usuario | id_res | respuesta |
+------------+--------+-----------+
|          3 |      2 | bla bla   |
|          3 |      2 | bla bla   |
|          3 |      2 | bla bla   |
|          3 |      2 | bla bla   |
+------------+--------+-----------+
4 ROWS IN SET (0.00 sec)
 
 

Ahora suponiendo que el valor 2 se repite en otra tabla ademas de la ante expuesta, serian 1 join de 2 tablas, donde id_usuario se repitiese mas de 2 veces.

Código
 
mysql> SELECT * FROM Libro;
+----------+--------------------+---------------------------------+
| id_libro | titulo             | pregunta                        |
+----------+--------------------+---------------------------------+
|        1 | Como es el Sol?    | Quisiera saber porque es blanco |
|        2 | Como es la lluvia? | Porque es transparente          |
|        3 | Juego Favorito     | Cual me recomiendan             |
+----------+--------------------+---------------------------------+
3 ROWS IN SET (0.00 sec)
 
mysql> SELECT * FROM Respuesta INNER JOIN Libro WHERE id_usuario = 3 AND id_res = 2 AND id_libro = id_res HAVING(id_usuario) > 2;
+------------+--------+-----------+----------+--------------------+------------------------+
| id_usuario | id_res | respuesta | id_libro | titulo             | pregunta               |
+------------+--------+-----------+----------+--------------------+------------------------+
|          3 |      2 | bla bla   |        2 | Como es la lluvia? | Porque es transparente |
|          3 |      2 | bla bla   |        2 | Como es la lluvia? | Porque es transparente |
|          3 |      2 | bla bla   |        2 | Como es la lluvia? | Porque es transparente |
|          3 |      2 | bla bla   |        2 | Como es la lluvia? | Porque es transparente |
+------------+--------+-----------+----------+--------------------+------------------------+
4 ROWS IN SET (0.00 sec)
 
 

En caso de que quieras actualizar el valor '2' de las 2 tablas expuestas anteriormente (Libro y Respuestas) Mas o menos se haria asi:

Código
mysql> UPDATE Respuesta, Libro SET Respuesta.id_res = 60, Libro.id_libro = 60 WHERE Respuesta.id_usuario > 2 AND Respuesta.id_res = 2;
 
mysql> SELECT * FROM Respuesta;
+------------+--------+--------------------------------------+
| id_usuario | id_res | respuesta                            |
+------------+--------+--------------------------------------+
|         22 |      1 | Es blanco por su iluminacion interna |
|         22 |      1 | Entonces porque cambia a amarillo    |
|         22 |      1 | por efecto de alejacion              |
|          2 |      2 | por la gravedad                      |
|          2 |      2 | Por la densidad                      |
|         55 |     60 | bla bla                              |
|         55 |     60 | bla bla                              |
|         55 |     60 | bla bla                              |
|         55 |     60 | bla bla                              |
+------------+--------+--------------------------------------+
9 ROWS IN SET (0.00 sec)
 
mysql> SELECT * FROM Libro;
+----------+--------------------+---------------------------------+
| id_libro | titulo             | pregunta                        |
+----------+--------------------+---------------------------------+
|       60 | Como es el Sol?    | Quisiera saber porque es blanco |
|        2 | Como es la lluvia? | Porque es transparente          |
|        3 | Juego Favorito     | Cual me recomiendan             |
+----------+--------------------+---------------------------------+
3 ROWS IN SET (0.00 sec)
 
 

Resultara un poco incomodo, pero no hay una llave magica que busque 1 valor especifico en todos los campos de una o mas tablas a la vez (Al menos yo particularmente no conozco la manera si otr@ la conoce bienvenida sea) Puedes en su lugar idear algo ya sea a traves de lenguaje de programacion en un bucle ir comparando el dato buscado con todos los campos de una tabla o algo asi, o hacer una consulta SQL un poco larga pero que te permita buscar un dato en todos los campos de una o mas tablas.

MazarD:
Como ya comentaba ^TiFa^ no puedes substituir un valor en toda la base de datos así por las buenas, además resulta bastante extraño y a la vez peligroso necesitar hacer eso, pero en fin, una buena solucion es utilizar un stored procedure de mysql (a partir de la version 5), consultar information_schema.columns para saber todas las columnas de cada tabla en la base de datos y construir un update dinámicamente para substituir los valores.

Dejo un ejemplo, hay que testearlo porque seguro tiene 20 errores ya que lo programo al vuelo, pero para entender la idea ya sirve:

Código
CREATE PROCEDURE substitucion(IN viejo VARCHAR(128), IN nuevo VARCHAR(128))
BEGIN
DECLARE ctabla CURSOR FOR
SELECT TABLE_NAME, column_name
FROM information_schema.COLUMNS;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET fin = 1;
OPEN ctabla;
REPEAT FETCH ctabla INTO tabla, columna;
SET @SQL := CONCAT('update ', tabla, ' set ',columna,' = ',nuevo, ' where ', columna,' = ', viejo);
PREPARE stmt FROM @SQL;
EXECUTE stmt;
UNTIL fin = 1
END REPEAT;
CLOSE ctabla;
END;

Navegación

[0] Índice de Mensajes

[#] Página Siguiente