MySQL的 - INSERT INTO XXX与AUTO_INCREMENT列

问题描述:

选择我有一个OLD_TABLE和NEW_TABLE:MySQL的 - INSERT INTO XXX与AUTO_INCREMENT列

 
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子句中的列,因为在真正的系统中,这些表有很多列。

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

+2

尝试这样 http://*.com/questions/9122/select-all-columns-except-one-in-mysql – 2012-07-19 16:39:22

+0

@AndreyVorobyev execlude id字段:这是一个很好的解决方案。你为什么不把它作为答案发布? – 2012-07-19 16:52:11

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?

您可能可以创建一个before-insert触发器,用于测试id值的存在并将其替换为正确的新值(如果该值正确,则将其替换为null) - 我不知道MySQL是否会禁止或给予您下一个自动递增的值),如果它是重复的。我个人认为我不希望这种类型的触发器持续存在,但如果您只是做一次性插入,您可以创建触发器,执行插入操作,然后立即删除触发器。

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

INSERT INTO 'old_table' SELECT * FROM new_table