我在mySQL中有一个表ts1,由column1,...,column100和一个由column1,...,column100组成的表ts2组成。我想将ts1的column1,...,column90中的值替换为ts2中的值,而不列出所有列的名称。有什么想法吗?
答案 0 :(得分:0)
您必须动态分配值和列,因此您需要将变量与INFORMATION_SCHEMA.COLUMNS
结合使用。
ts1
的前90列创建一个CONCAT,然后将它们存储在变量@sql1
中。ts2
的最后10列创建相同的CONCAT,并将它们存储在变量@sql2
中。请注意,只有当您的表ts1
,ts2
具有相同的行数并且具有适当的列才能加入时,此解决方案才有效。
另请注意,如果您在phpMyAdmin中尝试此操作,它将无法运行,但如果您打开MySQL控制台并复制&粘贴它,它将被正确执行。
SET @sql = NULL;
SET @sql1 = NULL;
SET @sql2 = NULL;
SET @t1 = 'ts1';
SET @t2 = 'ts2';
SET @t3 = 'ts3';
SELECT GROUP_CONCAT(CONCAT(@t1, '.' ,COLUMN_NAME)) INTO @sql1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = @t1 AND table_schema = 'a' AND ORDINAL_POSITION <= 90;
SELECT GROUP_CONCAT(CONCAT(@t2, '.', COLUMN_NAME)) INTO @sql2
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = @t2 AND table_schema = 'a' AND ORDINAL_POSITION > 90;
SET @sql = CONCAT('INSERT INTO ', @t3, ' (', ' SELECT ', @sql1, ', ', @sql2, ' FROM ', @t1, ' INNER JOIN ', @t2, ' ON ', @t1, '.col1 = ', @t2, '.col1 );');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;