Actualizar todas las columnas que tengan el mismo nombre entre dos tablas en MySQL

publicado por: Anonymous

Tengo dos tablas con varios nombres de columna que se parecen y quisiera saber la forma de hacer un UPDATE de una tabla a otra sin tener que especificar todos los nombres de columna.

Supongamos que tengo entre las dos tablas 50 nombres de columnas que son idénticos entre ellas:

tabla1

id, col1, col2, col3 ... col50

tabla2

id, col1, col2, col3 ... col50

Si quiero actualizar datos de una tabla a otra puedo hacer esto:

UPDATE tabla1 a
JOIN tabla2 b ON a.id = b.id
   SET 
   a.col1 = b.col1,
   a.col2 = b.col2
   -- ... ¡si pudiera evitarme tener que escribir esto 50 veces!
   a.colN = b.colN

WHERE b.id=10908576;

¿Es posible hacer el UPDATE de todas las columnas que se llamen igual entre las dos tablas sin tener que poner cada vez en el SET lo siguiente: a.colN = b.colN?

solución

No existe ninguna clausula SQL que permita hacer lo que esperas, la única forma es construir de forma dinámica una consulta de actualización tal como te lo mencionó antes Javier. Veamos como sería:

En primer lugar tenemos dos tablas que tienen algunos campos con el mismo nombre (suponemos que son del mismo tipo y la misma longitud)

create table tabla1 (
    id int,
    col1 int,
    col2 int,
    col3 int,
    col4 int
);

create table tabla2 (
    id int,
    col1 int,
    col2 int,
    col3 int
);

INSERT INTO tabla1 (id, col1, col2, col3, col4) values (1, 0, 0, 0, 0);
INSERT INTO tabla2 (id, col1, col2, col3) values (1, 1, 1, 1);

Y queremos actualizar los datos de Tabla1 de los campos “compartidos” sin contar el id con los mismos valores de la tabla2. En nuestro ejemplo serían los campos col1, col2y col3 y descartamos el id por que obviamente no queremos actualizarlo. Para esto vamos a construir una sentencia de update dinámica a partir de la tabla INFORMATION_SCHEMA.COLUMNS

SET @campos = '';

SELECT  GROUP_CONCAT( concat('    a.',C1.COLUMN_NAME, ' = b.', C1.COLUMN_NAME) separator ',n' )
  INTO @campos
  FROM INFORMATION_SCHEMA.COLUMNS C1
  INNER JOIN INFORMATION_SCHEMA.COLUMNS C2
      ON C2.COLUMN_NAME = C1.COLUMN_NAME
  WHERE C1.TABLE_NAME = 'tabla1'
        AND C2.TABLE_NAME = 'tabla2'
        AND C1.COLUMN_NAME <> 'id';
        AND C1.TABLE_SCHEMA = DATABASE()
        AND C2.TABLE_SCHEMA = DATABASE();

-- Seteamos el id que queremos actualizar  
SET @id  = '1';

SET @sql = CONCAT('UPDATE tabla1 anJOIN tabla2 bn    ON a.id = b.idnSETn', @campos, 'nWHERE a.id = ', @id, '');

SELECT @sql;

Con esto completamos nuestra variable @Sql con la siguiente información:

UPDATE tabla1 a
JOIN tabla2 b
    ON a.id = b.id
SET
    a.col1 = b.col1,
    a.col2 = b.col2,
    a.col3 = b.col3
WHERE a.id = 1

Ahora queda claro lo que queremos lograr, simplemente quedaría ejecutar esta consulta de la siguiente forma:

-- Actualización
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *