elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  Bases de Datos (Moderador: Carloswaldo)
| | | |-+  como reemplazo un registro en una db?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: como reemplazo un registro en una db?  (Leído 5,087 veces)
Cergath


Desconectado Desconectado

Mensajes: 340



Ver Perfil
como reemplazo un registro en una db?
« en: 24 Noviembre 2009, 01:49 am »

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...


En línea

^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: como reemplazo un registro en una db?
« Respuesta #1 en: 24 Noviembre 2009, 02:00 am »

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
  1.  
  2. mysql> SELECT * FROM Respuesta;
  3. +------------+--------+--------------------------------------+
  4. | id_usuario | id_res | respuesta                            |
  5. +------------+--------+--------------------------------------+
  6. |          1 |      1 | Es blanco por su iluminacion interna |
  7. |          1 |      1 | Entonces porque cambia a amarillo    |
  8. |          1 |      1 | por efecto de alejacion              |
  9. |          2 |      2 | por la gravedad                      |
  10. |          2 |      2 | Por la densidad                      |
  11. +------------+--------+--------------------------------------+
  12. 5 ROWS IN SET (0.00 sec)  
  13.  
  14. mysql> UPDATE Respuesta SET id_usuario = 22 WHERE id_usuario < 2;
  15. Query OK, 3 ROWS affected (0.00 sec)
  16. ROWS matched: 3  Changed: 3  Warnings: 0
  17.  
  18. mysql> SELECT * FROM Respuesta;
  19. +------------+--------+--------------------------------------+
  20. | id_usuario | id_res | respuesta                            |
  21. +------------+--------+--------------------------------------+
  22. |         22 |      1 | Es blanco por su iluminacion interna |
  23. |         22 |      1 | Entonces porque cambia a amarillo    |
  24. |         22 |      1 | por efecto de alejacion              |
  25. |          2 |      2 | por la gravedad                      |
  26. |          2 |      2 | Por la densidad                      |
  27. +------------+--------+--------------------------------------+
  28. 5 ROWS IN SET (0.00 sec)
  29.  
  30.  

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.


En línea

Cergath


Desconectado Desconectado

Mensajes: 340



Ver Perfil
Re: como reemplazo un registro en una db?
« Respuesta #2 en: 24 Noviembre 2009, 03:11 am »

:( 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?
En línea

^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: como reemplazo un registro en una db?
« Respuesta #3 en: 24 Noviembre 2009, 03:28 am »

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
  1.    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
  1. mysql> SELECT * FROM Respuesta WHERE id_usuario = 22 AND id_res = 22;
  2.  

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

Código
  1.  
  2. mysql> SELECT * FROM Respuesta;
  3. +------------+--------+--------------------------------------+
  4. | id_usuario | id_res | respuesta                            |
  5. +------------+--------+--------------------------------------+
  6. |         22 |      1 | Es blanco por su iluminacion interna |
  7. |         22 |      1 | Entonces porque cambia a amarillo    |
  8. |         22 |      1 | por efecto de alejacion              |
  9. |          2 |      2 | por la gravedad                      |
  10. |          2 |      2 | Por la densidad                      |
  11. |          3 |      2 | bla bla                              |
  12. |          3 |      2 | bla bla                              |
  13. |          3 |      2 | bla bla                              |
  14. |          3 |      2 | bla bla                              |
  15. +------------+--------+--------------------------------------+
  16. 9 ROWS IN SET (0.00 sec)
  17.  
  18. mysql> SELECT * FROM Respuesta WHERE id_usuario = 3 AND id_res = 2 HAVING(id_usuario) > 2;
  19. +------------+--------+-----------+
  20. | id_usuario | id_res | respuesta |
  21. +------------+--------+-----------+
  22. |          3 |      2 | bla bla   |
  23. |          3 |      2 | bla bla   |
  24. |          3 |      2 | bla bla   |
  25. |          3 |      2 | bla bla   |
  26. +------------+--------+-----------+
  27. 4 ROWS IN SET (0.00 sec)
  28.  
  29.  

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
  1.  
  2. mysql> SELECT * FROM Libro;
  3. +----------+--------------------+---------------------------------+
  4. | id_libro | titulo             | pregunta                        |
  5. +----------+--------------------+---------------------------------+
  6. |        1 | Como es el Sol?    | Quisiera saber porque es blanco |
  7. |        2 | Como es la lluvia? | Porque es transparente          |
  8. |        3 | Juego Favorito     | Cual me recomiendan             |
  9. +----------+--------------------+---------------------------------+
  10. 3 ROWS IN SET (0.00 sec)
  11.  
  12. mysql> SELECT * FROM Respuesta INNER JOIN Libro WHERE id_usuario = 3 AND id_res = 2 AND id_libro = id_res HAVING(id_usuario) > 2;
  13. +------------+--------+-----------+----------+--------------------+------------------------+
  14. | id_usuario | id_res | respuesta | id_libro | titulo             | pregunta               |
  15. +------------+--------+-----------+----------+--------------------+------------------------+
  16. |          3 |      2 | bla bla   |        2 | Como es la lluvia? | Porque es transparente |
  17. |          3 |      2 | bla bla   |        2 | Como es la lluvia? | Porque es transparente |
  18. |          3 |      2 | bla bla   |        2 | Como es la lluvia? | Porque es transparente |
  19. |          3 |      2 | bla bla   |        2 | Como es la lluvia? | Porque es transparente |
  20. +------------+--------+-----------+----------+--------------------+------------------------+
  21. 4 ROWS IN SET (0.00 sec)
  22.  
  23.  

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
  1. mysql> UPDATE Respuesta, Libro SET Respuesta.id_res = 60, Libro.id_libro = 60 WHERE Respuesta.id_usuario > 2 AND Respuesta.id_res = 2;
  2.  
  3. mysql> SELECT * FROM Respuesta;
  4. +------------+--------+--------------------------------------+
  5. | id_usuario | id_res | respuesta                            |
  6. +------------+--------+--------------------------------------+
  7. |         22 |      1 | Es blanco por su iluminacion interna |
  8. |         22 |      1 | Entonces porque cambia a amarillo    |
  9. |         22 |      1 | por efecto de alejacion              |
  10. |          2 |      2 | por la gravedad                      |
  11. |          2 |      2 | Por la densidad                      |
  12. |         55 |     60 | bla bla                              |
  13. |         55 |     60 | bla bla                              |
  14. |         55 |     60 | bla bla                              |
  15. |         55 |     60 | bla bla                              |
  16. +------------+--------+--------------------------------------+
  17. 9 ROWS IN SET (0.00 sec)
  18.  
  19. mysql> SELECT * FROM Libro;
  20. +----------+--------------------+---------------------------------+
  21. | id_libro | titulo             | pregunta                        |
  22. +----------+--------------------+---------------------------------+
  23. |       60 | Como es el Sol?    | Quisiera saber porque es blanco |
  24. |        2 | Como es la lluvia? | Porque es transparente          |
  25. |        3 | Juego Favorito     | Cual me recomiendan             |
  26. +----------+--------------------+---------------------------------+
  27. 3 ROWS IN SET (0.00 sec)
  28.  
  29.  

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.
« Última modificación: 24 Noviembre 2009, 04:42 am por ^TiFa^ » En línea

MazarD
Colaborador
***
Desconectado Desconectado

Mensajes: 885


mazard.info


Ver Perfil WWW
Re: como reemplazo un registro en una db?
« Respuesta #4 en: 24 Noviembre 2009, 19:32 pm »

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
  1. CREATE PROCEDURE substitucion(IN viejo VARCHAR(128), IN nuevo VARCHAR(128))
  2. BEGIN
  3. DECLARE ctabla CURSOR FOR
  4. SELECT TABLE_NAME, column_name
  5. FROM information_schema.COLUMNS;
  6. DECLARE CONTINUE HANDLER FOR NOT FOUND SET fin = 1;
  7. OPEN ctabla;
  8. REPEAT FETCH ctabla INTO tabla, columna;
  9. SET @SQL := CONCAT('update ', tabla, ' set ',columna,' = ',nuevo, ' where ', columna,' = ', viejo);
  10. PREPARE stmt FROM @SQL;
  11. EXECUTE stmt;
  12. UNTIL fin = 1
  13. END REPEAT;
  14. CLOSE ctabla;
  15. END;
« Última modificación: 24 Noviembre 2009, 19:34 pm por MazarD » En línea

-Learn as if you were to live forever, live as if you were to die tomorrow-

http://www.mazard.info
irc://irc.freenode.org/elhacker.net
Embusterillo de bolsillo


Desconectado Desconectado

Mensajes: 1.333


Yo-jo Yo-jo Un Pirata Yo Soy ♫♫


Ver Perfil
Re: como reemplazo un registro en una db?
« Respuesta #5 en: 24 Noviembre 2009, 21:50 pm »

Hola,

Es posible buscar algo en la DB y reemplazar el registro, sin embargo, en caso de hacer eso con un script por ejemplo, si modificas un valor importante, podrías dañar la caché, luego de eso tendrías que reconstruirla. Es por eso que muchos scripts traen herramientas/tools para bajar de sus webs que se encargan de eso.

Este script en PHP te permitirá conectarte a la base de datos y modificar un valor dentro de ella, hará todo global, mucho cuidado, haz un backup porque podrías dañar la base de datos.

http://www.whitesystem.net/assets_permanent/reemplazar.zip

Espero que pueda ser de utilidad.
Un saludo.
En línea

Absence makes the heart grow fonder.
^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: como reemplazo un registro en una db?
« Respuesta #6 en: 25 Noviembre 2009, 00:43 am »

Aunque no he visto dicho script php, espero que no sea muy cruel o danino, el usuario que inicio el post quiere algo automatico para buscar un mismo registro repetido en una, dos, tres o mas tablas en todos sus campos.... eso hasta lo que se de la forma tan automatica como el lo quiere no es posible. Los scripts pueden ayudar (sabiendo lo que se hace) igual como un procedimiento almacenado (sabiendo tambien lo que se hace) o opcionalmente puede hacerlo en una consulta SQL como le mostre, decision personal de el cual le quede mejor.

Citar
si modificas un valor importante, podrías dañar la caché, luego de eso tendrías que reconstruirla.

Este punto no me aclaro, si hablamos de MySQL (que no sabemos bajo que motor de DB el chico esta trabajando) pero si hicieramos referencia a MySQL, y si el realmente tiene activa la cache del motor se reseteara siempre que haga un insert, update o delete.... por ende estara constantemente defragmentando la cache y eso causa sobrecarga de I/O en disco, la cache es buena tenerla activa si hacemos referencia a una datawarehouse o similar, de lo contrario para un hosting lo mejor es desabilitarla o en su lugar usar una herramienta de terceros como memcache como API en php o funciones memcached dentro de MySQL como una funcion UDF entre varios servidores para compartir la carga (funcionamiento similar a MySQL cluster). Pero eso ya es otro tema independiente al peticionado por el...
« Última modificación: 25 Noviembre 2009, 00:44 am por ^TiFa^ » En línea

Embusterillo de bolsillo


Desconectado Desconectado

Mensajes: 1.333


Yo-jo Yo-jo Un Pirata Yo Soy ♫♫


Ver Perfil
Re: como reemplazo un registro en una db?
« Respuesta #7 en: 25 Noviembre 2009, 01:57 am »

Los dos métodos son prácticos y el script busca y reemplaza, cumple las funciones de comando, puedes analizar los ficheros para que veas como es su funcionamiento.

Tienes razón.
Perdona no leer todo tu segundo párrafo, hablaré en pro de scripts como IPBoard que luego de una alteración severa en la base de datos necesitará un rebuild del script, con medios externos porque hasta las aplicaciones internas se "dañan", este es un ejemplo del error que daría IPBoard en caso de cambiar simplemente el nombre del sitio de manera global (replicandose post por post)

Código
  1. /**
  2. * Set up settings
  3. *
  4. * @return void
  5. * @author MattMecham
  6. * @access protected
  7. */
  8. protected function setUpSettings()
  9. {
  10. $settings_cache = self::$handles['caches']->getCache('settings');
  11.  
  12. if ( ! is_array( $settings_cache ) OR ! count( $settings_cache ) )
  13. {
  14. throw new Exception( "Could not initiate the registry, the settings cache is empty or missing" );
  15. }
  16.  
  17. foreach( $settings_cache as $k => $v )
  18. {
  19. ipsRegistry::$settings[$k] = $v;
  20. }
  21.  

Respuesta a TiFa en la última entrada
Hola TiFa, así cómo tu dices, "no hay que desvirtuar el tema", prefiero ceder a tener que iniciar una discución (discución no implica una pelea, sino dualismo) y tener que dar otro camino al tema, arreglemos esto en privado  >:( >:( jaja es broma ... nos vemos a la salida

Cergath, confía en que cualquiera de los métodos funcionará, tu usa el que te te quede más accesible y/o práctico.
« Última modificación: 25 Noviembre 2009, 02:39 am por Danfelbm » En línea

Absence makes the heart grow fonder.
^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: como reemplazo un registro en una db?
« Respuesta #8 en: 25 Noviembre 2009, 02:21 am »

Hola Danfe, espero no desvirtuar mucho este tema. El codigo que pegaste obtiene los valores desde la cache de MySQL??? y los cambia segun los valores encontrados dentro de la cache de MySQL?????. No entiendo mucho php , pero si este codigo trabaja en base a la cache de MySQL no indica que sea siempre efectivo.

Por ejemplo, no siempre la cache en MySQL esta activa (se puede iniciar con esta desabilitada) suponiendo que si, que esta activa mira un ejemplo de mi cache en MySQL y lo que te digo:

Código
  1.  
  2. mysql> SHOW STATUS LIKE 'Qcache%';
  3. +-------------------------+----------+
  4. | Variable_name           | VALUE    |
  5. +-------------------------+----------+
  6. | Qcache_free_blocks      | 1        |
  7. | Qcache_free_memory      | 16768408 |
  8. | Qcache_hits             | 0        |
  9. | Qcache_inserts          | 0        |
  10. | Qcache_lowmem_prunes    | 0        |
  11. | Qcache_not_cached       | 4        |
  12. [b]| Qcache_queries_in_cache | 0        |[/b]
  13. | Qcache_total_blocks     | 1        |
  14. +-------------------------+----------+
  15. 8 ROWS IN SET (0.00 sec)              
  16.  
  17. mysql> SELECT * FROM Libro;
  18.  
  19. mysql> SELECT * FROM Respuesta;
  20. mysql> SHOW STATUS LIKE 'Qcache%';
  21. +-------------------------+----------+
  22. | Variable_name           | VALUE    |
  23. +-------------------------+----------+
  24. | Qcache_free_blocks      | 1        |
  25. | Qcache_free_memory      | 16765336 |
  26. | Qcache_hits             | 0        |
  27. | Qcache_inserts          | 2        |
  28. | Qcache_lowmem_prunes    | 0        |
  29. | Qcache_not_cached       | 6        |
  30. [b]| Qcache_queries_in_cache | 2        |[/b]
  31. | Qcache_total_blocks     | 7        |
  32. +-------------------------+----------+
  33. 8 ROWS IN SET (0.00 sec)
  34.  

| Qcache_queries_in_cache | 0        |
| Qcache_queries_in_cache | 2        |

Hago referencia al resultado en negrita obtenida de la cache (La cache en MySQL va guardando peticiones en memoria siempre que se use SELECT pero se resetea completamente al usar otra clausula (digase INSERT, DELETE, UPDATE)

Código
  1.  
  2. mysql> INSERT INTO Libro VALUES(5,'no se', 'nananana');
  3. Query OK, 1 ROW affected (0.00 sec)
  4.  
  5. mysql> SHOW STATUS LIKE 'Qcache%';
  6. +-------------------------+----------+
  7. | Variable_name           | VALUE    |
  8. +-------------------------+----------+
  9. | Qcache_free_blocks      | 2        |
  10. | Qcache_free_memory      | 16766872 |
  11. | Qcache_hits             | 0        |
  12. | Qcache_inserts          | 2        |
  13. | Qcache_lowmem_prunes    | 0        |
  14. | Qcache_not_cached       | 8        |
  15. [b]| Qcache_queries_in_cache | 1        |[/b]
  16. | Qcache_total_blocks     | 5        |
  17. +-------------------------+----------+
  18. 8 ROWS IN SET (0.00 sec)
  19.  

| Qcache_queries_in_cache | 1        |


Nuevamente recalco en la negrita, vez como elimino 1 registro del cache (que tenia 2 valores) al yo utilizar INSERT? si utilizo otra clausula como UPDATE o DELETE ese ultimo registro que queda tambien sera eliminado de cache, y al retornar a hacer un SELECT este nuevo dato volvera a guardarse en cache, y luego al usar insert, delete o update voila... a eliminar..

No es recomendable en situaciones donde haya mucha solicitud de escritura o actualizacion de una DB (Al menos MySQL) activar la cache del motor, es preferible tenerla en estos casos desactivada. Asi te evitas lecturas constantes de disco (tanto en escritura como lectura y eliminacion).
« Última modificación: 25 Noviembre 2009, 02:25 am por ^TiFa^ » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Reemplazo de Memoria
Windows
mhoker 2 3,093 Último mensaje 13 Diciembre 2010, 07:00 am
por Randomize
[RETO] Reemplazo de Operadores Binarios.
Programación Visual Basic
79137913 3 3,808 Último mensaje 8 Abril 2011, 14:12 pm
por 79137913
Batería de reemplazo
Electrónica
jota93 0 2,567 Último mensaje 10 Abril 2013, 18:38 pm
por jota93
Zorin OS 15 Lite llega como reemplazo a Windows 7
Noticias
wolfbcn 0 1,731 Último mensaje 22 Noviembre 2019, 01:06 am
por wolfbcn
Si se rompe un ventilador de tu GPU, ¿cómo saber el modelo para su reemplazo?
Noticias
El_Andaluz 0 1,199 Último mensaje 26 Abril 2020, 23:00 pm
por El_Andaluz
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines