Título: como reemplazo un registro en una db? Publicado por: Cergath 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...
Título: Re: como reemplazo un registro en una db? Publicado por: ^Tifa^ 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
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. Título: Re: como reemplazo un registro en una db? Publicado por: Cergath 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?
Título: Re: como reemplazo un registro en una db? Publicado por: ^Tifa^ 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
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
Para que busque campo por campo donde exista ese valor, por ejemplo: Código
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
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
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. Título: Re: como reemplazo un registro en una db? Publicado por: MazarD 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
Título: Re: como reemplazo un registro en una db? Publicado por: Embusterillo de bolsillo 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. Título: Re: como reemplazo un registro en una db? Publicado por: ^Tifa^ 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... Título: Re: como reemplazo un registro en una db? Publicado por: Embusterillo de bolsillo 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
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. Título: Re: como reemplazo un registro en una db? Publicado por: ^Tifa^ 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
| 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
| 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). |