[关闭]
@xtccc 2017-06-05T12:40:16.000000Z 字数 768 阅读 1600

MySQL skills

Database



1. 表间复制数据,但是排除某列


需求描述

有两张表:dev.t和pge.t,其中,pge.t中有一些batchid = 'hello'的数据,想把这些数据都写入到dev.t表中,但是__pk_key这一列除外。


在表间复制全部columns的SQL是:

  1. insert into t1
  2. select * from t2 where x = 'a';



在表间复制部分columns的SQL是:

  1. insert into t1 (c1, c2, c3)
  2. select c1, c2, c3 from t2 where x = 'a';



因此,首先解决怎样得到排除某column后的其他column names.

  1. SET @allcolumns = (SELECT GROUP_CONCAT(COLUMN_NAME)
  2. FROM INFORMATION_SCHEMA.COLUMNS
  3. WHERE TABLE_NAME = 't' AND TABLE_SCHEMA = 'pge') ;
  4. select @allcolumns; -- 显示全部columns
  5. SET @columns = (replace(@allcolumns, '__pk_key,', ''));
  6. select @columns; -- 显示除了 __pk_key 之外的其他columns



其他,@allcolumns@columns实际上都是字符串,select @allcolumns from t 是不能被解释成 select * from t 的,需要通过prepared statment进行转换:

  1. SET @s = CONCAT(
  2. 'insert into dev.t (', @columns, ') ',
  3. 'select ',
  4. @columns,
  5. ' from pge.t where batchid = \'',
  6. @batchUUID,
  7. '\'');
  8. prepare stmt from @s;
  9. execute stmt;

大功告成。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注