Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Mysql (http://www.forosdelweb.com/f86/)
-   -   Copiar datos entre tablas (http://www.forosdelweb.com/f86/copiar-datos-entre-tablas-580405/)

Bandit_S 27/04/2008 03:12

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

quimfv 27/04/2008 05:01

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

Bandit_S 28/04/2008 09:46

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

jurena 28/04/2008 10:29

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

Bandit_S 28/04/2008 10:46

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

jurena 28/04/2008 12:10

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


Bandit_S 29/04/2008 03:58

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.

gnzsoloyo 29/04/2008 05:11

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

Bandit_S 29/04/2008 05:36

Re: Copiar datos entre tablas
 
Cita:

Iniciado por gnzsoloyo (Mensaje 2383709)
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

gnzsoloyo 29/04/2008 06:48

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.

jurena 29/04/2008 07:47

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

gnzsoloyo 29/04/2008 11:18

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.

Bandit_S 29/04/2008 11:32

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

gnzsoloyo 29/04/2008 13:11

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.

quimfv 29/04/2008 17:33

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

Bandit_S 30/04/2008 00:23

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

Tabla nuke_bbbanlist

http://img528.imageshack.us/img528/3...listza3.th.jpg

Tabla nuke_users

http://img100.imageshack.us/img100/5...sersal6.th.jpg

Espero que esto sea de ayuda.

Un saludo

quimfv 30/04/2008 01:01

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


La zona horaria es GMT -6. Ahora son las 22:54.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.