在MySQL中插入时,从两个表中选择identicle列
我在不同的数据库中有两个相同的表在MySQL中插入时,从两个表中选择identicle列,mysql,sql,Mysql,Sql,我在不同的数据库中有两个相同的表 Database : live table : customer id | name | email | address 及 这只是一个示例结构。我在实时数据库表中有15个字段,在测试数据库表中有35个字段。我想写一个查询,它可以将数据从live插入测试数据库表。我该怎么做呢。我试过这个 INSERT INTO test.customer SELECT * FROM live.customer as cd WHERE NOT EXISTS(SELECT * f
Database : live
table : customer
id | name | email | address
及
这只是一个示例结构。我在实时数据库表中有15个字段,在测试数据库表中有35个字段。我想写一个查询,它可以将数据从live插入测试数据库表。我该怎么做呢。我试过这个
INSERT INTO test.customer
SELECT *
FROM live.customer as cd
WHERE NOT EXISTS(SELECT * from test.customer);
如果数据顺序不同,则会将其插入错误的列中。这是我尝试过的另一种方式
INSERT INTO test.customer (id,name,email,address)
SELECT *
FROM live.customer as cd
WHERE NOT EXISTS(SELECT * from test.customer);
这很好,但我不想写15个列名。如何从live database表中选择所有列并将其结果放入insert()中。我认为没有一个纯SQL解决方案。但您可以使用以下方式创建的动态查询:
SET @sql = null;
SELECT
CONCAT('INSERT INTO test.customer (',
group_concat(CONCAT('`', COLUMN_NAME, '`') separator ','),
') SELECT ',
group_concat(CONCAT('`', COLUMN_NAME, '`') separator ','),
' FROM live.customer WHERE NOT EXISTS(SELECT * from test.customer)')
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_NAME`='customer' AND `TABLE_SCHEMA`='test'
INTO @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT * FROM test_customer;
请参阅fiddle。@raheelshan我更新了一点我的答案,因为不能保证使用GROUP_CONCAT列名总是以相同的顺序返回,最好在选择部分也指定列名,而不是使用*,我还添加了一个CONCAT来引用列名,希望这有帮助:)
SET @sql = null;
SELECT
CONCAT('INSERT INTO test.customer (',
group_concat(CONCAT('`', COLUMN_NAME, '`') separator ','),
') SELECT ',
group_concat(CONCAT('`', COLUMN_NAME, '`') separator ','),
' FROM live.customer WHERE NOT EXISTS(SELECT * from test.customer)')
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_NAME`='customer' AND `TABLE_SCHEMA`='test'
INTO @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT * FROM test_customer;