2011-04-21 102 views
0

我有一个wp_users表中的数据,我想将该表中的数据(ID列除外)复制到另一个表中,名为wp_users2如何从mySql中的EXECUTE语句插入数据?

如果我不关心id列,这是我想自动递增,我可能只是这样做:

insert into wp_users2 (select *, NULL as ID from wp_users) 

所以我知道我可以通过键入的所有列的做到这一点标题除ID和手动选择一个为NULL,

SELECT NULL as id, col2, col3... 

但我想动态地做它。我读this great S.O. post关于如何做到这一点,它的工作原理,但是我不知道如何把它给我的数据,并把它放入一个插入语句。

INSERT INTO wp_users2 (
    SET @sql = CONCAT('SELECT NULL as ID,', 
    (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), 'ID,', '') 
     FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE TABLE_NAME = 'wp_users' 
     AND TABLE_SCHEMA = 'wp1'), 
    ' FROM wp_users'); 
PREPARE stmt1 FROM @sql; 
EXECUTE stmt1; 
) 

什么是对于正确的语法?

回答

2

据我所知 - id是AUTO_INCREMENT字段。

因此,尝试使用这个脚本作为一个例子你的任务 -

CREATE TABLE table1(
    id INT(11) NOT NULL AUTO_INCREMENT, 
    column1 VARCHAR(255) DEFAULT NULL, 
    column2 VARCHAR(255) DEFAULT NULL, 
    PRIMARY KEY (id) 
); 

CREATE TABLE table2(
    id INT(11) NOT NULL AUTO_INCREMENT, 
    column1 VARCHAR(255) DEFAULT NULL, 
    column2 VARCHAR(255) DEFAULT NULL, 
    PRIMARY KEY (id) 
); 

INSERT INTO table1 VALUES 
    (1, 'c1', 'c2'), 
    (2, 'c3', 'c4'); 

SET @source_table = 'table1'; 
SET @target_table = 'table2'; 
SET @id = 'id'; 

SET @columns = NULL; 
SELECT group_concat(column_name) INTO @columns FROM information_schema.columns 
WHERE 
    table_schema = 'database_name' -- Set your database name here 
    AND table_name = @source_table 
    AND column_name != @id; 

SET @insert = concat('INSERT INTO ', @target_table, '(', @id, ',', @columns, ') SELECT NULL, ', @columns, ' FROM ', @source_table); 
PREPARE stmt1 FROM @insert; 
EXECUTE stmt1; 
DEALLOCATE PREPARE stmt1; 
+0

漂亮和干净。谢谢。 – cwd 2011-04-21 17:26:02

2
set @sql = (select concat('insert into wp_users2 SELECT NULL,', 
      group_concat(column_name),' from ',table_name) from information_schema.columns 
     where table_name = 'wp_users' and table_schema = 'wp1' and column_name != 'id' 
      order by ordinal_position); 

prepare stmt1 from @sql; 
execute stmt1; 
deallocate prepare stmt1;