MySQL - 使用AUTO_INCREMENT列插入INTO xxx SELECT

时间:2012-07-19 16:32:40

标签: mysql select insert auto-increment

我有一个old_table和一个new_table:

CREATE TABLE `old_table` (
        `id` bigint(20) NOT NULL AUTO_INCREMENT,
        `col1` varchar(15) DEFAULT NULL,
        `col2` int(15) DEFAULT NULL,
        ...,
        PREMARY_KEY (`id`)
);

CREATE TABLE `new_table` LIKE `old_table`;

然后两个表都填充了一些值。之后,我想从old_table中选择一些行并插入new_table:

INSERT INTO `old_table` SELECT * FROM `new_table` WHERE col2 > 100;

但是这会因重复键而导致错误。我懒得在SELECT子句中指定列,因为在实际系统中,表有很多列。

解决问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

set @sql =  (select concat('insert into new_table SELECT NULL,',
             group_concat(column_name),' from ','old_table') from information_schema.columns
         where table_name = 'old_table' and table_schema = '<database>' and column_name != 'id'
             order by ordinal_position);

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

,其中

<database> - your database

Select all columns except one in MySQL?

How to insert data from an EXECUTE statement in mySql?

答案 1 :(得分:2)

你可能会创建一个before-insert触发器来测试id值是否存在并用正确的新值替换它(如果有效则将其替换为null - 我不知道MySQL是否会barf如果它是重复的话,或者给你下一个自动递增的值。

就个人而言,我认为我不希望这种触发器持续存在,但是如果你只是进行一次性插入,你可以创建触发器,进行插入,然后立即放下触发器。 / p>

答案 2 :(得分:-1)

我遇到了同样的问题并解决了这个问题: - 修改new_table的id列(删除自动增量和主键,允许NULL) - 将new_table中的所有ID设置为NULL - 现在你可以做到

INSERT INTO 'old_table' SELECT * FROM new_table