Как вставить данные из оператора EXECUTE в mySql? - PullRequest
0 голосов
/ 21 апреля 2011

У меня есть данные в таблице wp_users, и я хочу скопировать данные из этой таблицы (кроме столбца идентификатора) в другую таблицу, которая называется wp_users2.

Если бы меня не волновал столбец id, который я хочу автоматически увеличивать, я мог бы просто сделать это:

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

Итак, я знаю, что мог бы сделать это, напечатав все заголовки столбцов, кроме ID, и вручную выбрав его как NULL,

SELECT NULL as id, col2, col3...

но я бы хотел сделать это динамически. Я прочитал этот замечательный пост SO о том, как это сделать, и он работает, однако я не могу понять, как взять данные, которые он мне дал, и поместить их в оператор вставки.

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 ]

2 голосов
/ 21 апреля 2011
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;
2 голосов
/ 21 апреля 2011

Как я понял - 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;
...