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

Copiar datos entre tablas

Estas en el tema de Copiar datos entre tablas en el foro de Mysql en Foros del Web. Buenas a todos. Tengo un phpnuke montado y quiero banear a todos los usuarios registrados a la vez. Creo que copiando todos los nombres de ...
  #1 (permalink)  
Antiguo 27/04/2008, 03:12
 
Fecha de Ingreso: agosto-2003
Mensajes: 192
Antigüedad: 20 años, 8 meses
Puntos: 0
Copiar datos entre tablas

Buenas a todos.

Tengo un phpnuke montado y quiero banear a todos los usuarios registrados a la vez. Creo que copiando todos los nombres de los usuarios a la tabla de usuarios baneados podria hacerlo rapidamente. Estas son las tablas y los campos que tengo.

Tengo por un lado la tabla nuke_users donde hay un campo llamado user_id .

La tabla nuke_bbbanlist es la cual donde se almacenan los datos de los usuarios baneados el campo ban_userid .

Resumiendo, quiero copiar TODOS los datos del campo user_id de la tabla nuke_users en el campo ban_userid . de la tabla nuke_bbbanlist .

Entiendo que esta consulta se deberia de hacer desde la tabla nuke_users.

Por cierto, lo voy a realizar a traves del phpmyadmin

Gracias de antemano y disculpen por repetir el mensaje en el foro adecuado...
  #2 (permalink)  
Antiguo 27/04/2008, 05:01
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Re: Copiar datos entre tablas

Código:
INSERT INTO nuke_bbbanlist (nuke_bbbanlist)
SELECT nuke_users.user_id
  FROM nuke_users LEFT JOIN  nuke_bbbanlist
             ON nuke_users.user_id=nuke_bbbanlist.nuke_bbbanlist
WHERE nuke_bbbanlist.nuke_bbbanlist Is Null;
Asi insertarás todos los que no esten...

Quim
  #3 (permalink)  
Antiguo 28/04/2008, 09:46
 
Fecha de Ingreso: agosto-2003
Mensajes: 192
Antigüedad: 20 años, 8 meses
Puntos: 0
Re: Copiar datos entre tablas

Pues despues de ejecutar el SQL en la tabla nuke_users, me devuelve este error:

#1066 - Not unique table/alias: 'nuke_bbbanlist'

A ver si alguien me puede decir donde esta el error.

Gracias de antemano.

Un saludo
  #4 (permalink)  
Antiguo 28/04/2008, 10:29
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Re: Copiar datos entre tablas

Quimfv te ha hecho el trabajo. Sucede que al pasarte los datos, en algún caso ha puesto como nombre de campos los nombres de tabla, pero cambialo y ya verás que funciona:
Código:
INSERT INTO nuke_bbbanlist (ban_userid)
SELECT nuke_users.user_id
  FROM nuke_users LEFT JOIN nuke_bbbanlist
             ON nuke_users.user_id = nuke_bbbanlist.ban_userid
WHERE nuke_bbbanlist.ban_userid Is Null
Suerte
  #5 (permalink)  
Antiguo 28/04/2008, 10:46
 
Fecha de Ingreso: agosto-2003
Mensajes: 192
Antigüedad: 20 años, 8 meses
Puntos: 0
Re: Copiar datos entre tablas

Gracias por la ayuda.

He revisado el codigo con las modificaciones que ha puesto y me devuelve el mismo error.

He intentando "traducir" el codigo y creo que esta correcto, pero me sigue devolviendo el mismo error.

#1066 - Not unique table/alias: 'nuke_bbbanlist'

Gracias de antemano.

Un saludo
  #6 (permalink)  
Antiguo 28/04/2008, 12:10
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Re: Copiar datos entre tablas

He puesto un alias al segundo nuke_bbbanlist para tratar de evitar el problema. Pruébalo a ver si funciona ahora:
Código:
INSERT INTO nuke_bbbanlist (ban_userid)
SELECT nuke_users.user_id
  FROM nuke_users LEFT JOIN nuke_bbbanlist b
             ON nuke_users.user_id = b.ban_userid WHERE b.ban_userid Is Null
  #7 (permalink)  
Antiguo 29/04/2008, 03:58
 
Fecha de Ingreso: agosto-2003
Mensajes: 192
Antigüedad: 20 años, 8 meses
Puntos: 0
Re: Copiar datos entre tablas

Pues gracias por la ayuda, pero me devuelve el siguiente error:

#1093 - INSERT TABLE 'nuke_bbbanlist' isn't allowed in FROM table list

No se donde puede estar el error.

Gracias de antemano.
  #8 (permalink)  
Antiguo 29/04/2008, 05:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Re: Copiar datos entre tablas

No se puede indicar como tabla destino del INSERT la tabla origen de un SELECT ... FROM. El motor no puede resolver las PK, índices ni los triggers si al mismo tiempo estás leyendo e insertando sobre la misma tabla. Además entra en conflicto la concurrencia de las transacciones (bloqueas la tabla y al mismo tiempo la pretendés leer).
  #9 (permalink)  
Antiguo 29/04/2008, 05:36
 
Fecha de Ingreso: agosto-2003
Mensajes: 192
Antigüedad: 20 años, 8 meses
Puntos: 0
Re: Copiar datos entre tablas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
No se puede indicar como tabla destino del INSERT la tabla origen de un SELECT ... FROM. El motor no puede resolver las PK, índices ni los triggers si al mismo tiempo estás leyendo e insertando sobre la misma tabla. Además entra en conflicto la concurrencia de las transacciones (bloqueas la tabla y al mismo tiempo la pretendés leer).
Muchas gracias gnzsoloyo espero que esta explicacion ayude a los expertos a ver si consigo realizar el copiado de datos de una tabla a la otra.

Un saludo
  #10 (permalink)  
Antiguo 29/04/2008, 06:48
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Re: Copiar datos entre tablas

Te conviene derivar la tarea a un Store Procedure y crear una tabla temporal con la estructura necesaria, luego hacer un volcado de los datos reunidos en la temporal a la definitiva.
Todo el proceso debería ser muy rápido.
  #11 (permalink)  
Antiguo 29/04/2008, 07:47
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Re: Copiar datos entre tablas

gnzsoloyo,


Lo que dices es clarificador y todos "nos aplicamos el cuento", pero me pregunto ¿por qué la consulta funcionó con una tabla MyISAM?, ¿se debió a que se trataba de una tabla de prueba con pocos datos o a que la naturaleza de esas tablas permite este tipo de cambios?

Gracias
  #12 (permalink)  
Antiguo 29/04/2008, 11:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Re: Copiar datos entre tablas

Comienza desde el momento en que las tablas MyISAM no son relacionales y que además no existen en las MyISAM transacciones ni control de concurrencia... Lo de los índices tiene que verse desde el punto de vista de cómo los administra MyISAM.
Las MyISAM y las InnoDB responden a modelos de datos diferentes.
  #13 (permalink)  
Antiguo 29/04/2008, 11:32
 
Fecha de Ingreso: agosto-2003
Mensajes: 192
Antigüedad: 20 años, 8 meses
Puntos: 0
Re: Copiar datos entre tablas

Ufff, pues me perdi hace varios mensajes.

Lo siento, pero mis conocimientos de Mysql son nulos.

Creia, con lo poco que me acordaba, de que haciendo un insert podria realizarse....
  #14 (permalink)  
Antiguo 29/04/2008, 13:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Re: Copiar datos entre tablas

Con la sola condición de que -aclarado lo de las MyISAM- no intentes actualizar una tabla sobre sí misma.
Si tienes que hacerlo por alguna razón, es mejor que generes una tabla temporal de transacción y la uses después para poner los datos en la origen al final del proceso.
No creo que tengas problemas si lo haces así. Solamente hay que buscarle la vuelta con un poco de imaginación.
  #15 (permalink)  
Antiguo 29/04/2008, 17:33
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Re: Copiar datos entre tablas

Código:
DROP TABLE IF EXISTS `forum`.`campanya`;
CREATE TABLE  `forum`.`campanya` (
  `idcampanya` int(11) NOT NULL,
  PRIMARY KEY  (`idcampanya`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `forum`.`vendes`;
CREATE TABLE  `forum`.`vendes` (
  `idvenda` int(11) NOT NULL auto_increment,
  `idcampanya` int(11) NOT NULL,
  `idproducte` int(11) NOT NULL,
  PRIMARY KEY  (`idvenda`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8;

INSERT INTO campanya (idcampanya)
SELECT DISTINCT v.idcampanya
  FROM vendes v LEFT JOIN  campanya c
             ON v.idcampanya=c.idcampanya
WHERE c.idcampanya Is Null;
Esto funciona con MySql 5.0.45, y creo que es una situación similar a la que expones...

Estoy haciendo un INSERT INTO a una tabla usandola en el select, la unica diferencia esta en el DISTICNT que lo he tenido que poner porque en mi caso idcampanya no era unico en la tabla de donde se sacan los datos (vendes)...

No estamos indicando la misma tabla de destino y de origen, de origen usamos una consulta sobre esta tabla y otra, no hay conflicto!!!

Bandit_S si nos pasas la definicion completa de las tablas quizas vemos algo.

La solución de la tabla temporal si no es una oparación que vayas ha hacer habitualmente no es mala.

Quim
  #16 (permalink)  
Antiguo 30/04/2008, 00:23
 
Fecha de Ingreso: agosto-2003
Mensajes: 192
Antigüedad: 20 años, 8 meses
Puntos: 0
Re: Copiar datos entre tablas

Gracias a todos por los mensajes, voy a poner la informacion que dispongo de las tablas:

Tabla nuke_bbbanlist



Tabla nuke_users



Espero que esto sea de ayuda.

Un saludo
  #17 (permalink)  
Antiguo 30/04/2008, 01:01
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Re: Copiar datos entre tablas

El problema podria venir por el NOT NULL que tienes en ban_ip. Tienes que darle algun valor, no se si lo puedes sacar de alguna tabla, si no tendras que forzarlo a 0 o a un valor concreto.


Código:
INSERT INTO nuke_bbbanlist (ban_userid, ban_ip)
SELECT u.user_id, 'XXXXX' as ban_ip
  FROM nuke_users u LEFT JOIN nuke_bbbanlist b
             ON u.user_id = b.ban_userid WHERE b.ban_userid Is Null
donde XXXX es el valor que pones a ban_ip.

no se que implicaciones a nivel de aplicación puede tener el hecho de forzar el valor de ese campo.

Otro problema que veo es que hay diferencias en el formato de

nuke_bbbanlist.ban_userid-->mediumint(8)
nuke_users.user_id-->int(11)

yo igualaria esos formatos, pero antes deberas revisar si ese cambio puede afectar a otras tablas, es decir tienes que mirar en todas las tablas que tengan el id de usuario y que todos tengan el mismo formato int(11).

Por otro lado ban_userid puede estar repetido por lo que igual con la siguiente consulta tambien te funciona, pero luego ten claro que puedes tener usuarios baneados repetidos y que la ip que pongas tendria que ser nueva para assegurar que las parejas ip/iduser son unicas...

Código:
INSERT INTO nuke_bbbanlist (ban_userid, ban_ip)
SELECT u.user_id, 'XXXXX' as ban_ip
  FROM nuke_users u;


Quim

Última edición por quimfv; 30/04/2008 a las 01:12
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 05:32.