Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中插入时,从两个表中选择identicle列_Mysql_Sql - Fatal编程技术网

在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;