Retroceder   Foros del Web > Programación para sitios web > Bases de Datos > Mysql

Respuesta
 
Herramientas Desplegado
Antiguo 27-abr-2008, 03:12   #1 (permalink)
Bandit_S está en el buen camino
 
Fecha de Ingreso: agosto-2003
Mensajes: 54
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...
Bandit_S está desconectado   Responder Citando
Antiguo 27-abr-2008, 05:01   #2 (permalink)
quimfv tiene algunos puntos positivos de karma
 
Fecha de Ingreso: marzo-2008
Mensajes: 442
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
quimfv está desconectado   Responder Citando
Antiguo 28-abr-2008, 09:46   #3 (permalink)
Bandit_S está en el buen camino
 
Fecha de Ingreso: agosto-2003
Mensajes: 54
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
Bandit_S está desconectado   Responder Citando
Antiguo 28-abr-2008, 10:29   #4 (permalink)
jurena tiene algunos puntos positivos de karma
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 790
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
jurena está desconectado   Responder Citando
Antiguo 28-abr-2008, 10:46   #5 (permalink)
Bandit_S está en el buen camino
 
Fecha de Ingreso: agosto-2003
Mensajes: 54
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
Bandit_S está desconectado   Responder Citando
Antiguo 28-abr-2008, 12:10   #6 (permalink)
jurena tiene algunos puntos positivos de karma
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 790
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
jurena está desconectado   Responder Citando
Antiguo 29-abr-2008, 03:58   #7 (permalink)
Bandit_S está en el buen camino
 
Fecha de Ingreso: agosto-2003
Mensajes: 54
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.
Bandit_S está desconectado   Responder Citando
Antiguo 29-abr-2008, 05:11   #8 (permalink)
gnzsoloyo tiene algunos puntos positivos de karma
 
Avatar de gnzsoloyo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 811
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).
gnzsoloyo está desconectado   Responder Citando
Antiguo 29-abr-2008, 05:36   #9 (permalink)
Bandit_S está en el buen camino
 
Fecha de Ingreso: agosto-2003
Mensajes: 54
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
Bandit_S está desconectado   Responder Citando
Antiguo 29-abr-2008, 06:48   #10 (permalink)
gnzsoloyo tiene algunos puntos positivos de karma
 
Avatar de gnzsoloyo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 811
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.
gnzsoloyo está desconectado   Responder Citando
Antiguo 29-abr-2008, 07:47   #11 (permalink)
jurena tiene algunos puntos positivos de karma
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 790
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
jurena está desconectado   Responder Citando
Antiguo 29-abr-2008, 11:18   #12 (permalink)
gnzsoloyo tiene algunos puntos positivos de karma
 
Avatar de gnzsoloyo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 811
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.
gnzsoloyo está desconectado   Responder Citando
Antiguo 29-abr-2008, 11:32   #13 (permalink)
Bandit_S está en el buen camino
 
Fecha de Ingreso: agosto-2003
Mensajes: 54
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....
Bandit_S está desconectado   Responder Citando
Antiguo 29-abr-2008, 13:11   #14 (permalink)
gnzsoloyo tiene algunos puntos positivos de karma
 
Avatar de gnzsoloyo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 811
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.
gnzsoloyo está desconectado   Responder Citando
Antiguo 29-abr-2008, 17:33   #15 (permalink)
quimfv tiene algunos puntos positivos de karma
 
Fecha de Ingreso: marzo-2008
Mensajes: 442
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
quimfv está desconectado   Responder Citando
Antiguo 30-abr-2008, 00:23   #16 (permalink)
Bandit_S está en el buen camino
 
Fecha de Ingreso: agosto-2003
Mensajes: 54
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
Bandit_S está desconectado   Responder Citando
Antiguo 30-abr-2008, 01:01   #17 (permalink)
quimfv tiene algunos puntos positivos de karma
 
Fecha de Ingreso: marzo-2008
Mensajes: 442
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-abr-2008 a las 01:12.
quimfv está desconectado   Responder Citando
Respuesta

No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 01:21.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93