如何根据非键列缓解重复的行插入?

时间:2011-09-27 16:25:57

标签: mysql insert duplicates data-transfer data-import

我需要将数据从一个MySQL表导入另一个MySQL表。旧表有一个不同的过时结构(这不是非常相关)。也就是说,我将一个字段附加到名为“imported_id”的新表中,该表保存旧表中的原始ID,以防止重复导入旧记录。

我现在的问题是,我如何实际防止重复?由于新系统与旧系统的并行部署,遗憾的是导入将不止一次。我无法创建“import_id”字段PK / UNIQUE,因为对于不是来自旧表的字段,它将具有空值,从而在添加新字段时抛出错误。有没有办法在运行中使用某种类型的INSERT IGNORE来获取本身没有约束的任意列?

我对这个问题的思考越多,我认为我应该在最初的SELECT中处理它。但是,我对一般处理这个问题的质量机制感兴趣。

最佳。

1 个答案:

答案 0 :(得分:2)

您应该能够在import_id列上创建唯一键,并仍然将该列指定为可为空。只有主键列必须指定为NOT NULL。

也就是说,在新表上,您可以在可空的import_id列上指定唯一键,然后在使用ON DUPLICATE KEY

从旧表插入新表时处理任何重复键错误

以下是我驾驶的基本工作示例:

create table your_table
(id int unsigned primary key auto_increment,
someColumn    varchar(50) not null,
import_id int null,
UNIQUE KEY `importIdUidx1` (import_id)
);



insert into your_table (someColumn,import_id) values ('someValue1',1) on duplicate key update someColumn = 'someValue1';
insert into your_table (someColumn) values ('someValue2');
insert into your_table (someColumn) values ('someValue3');;
insert into your_table (someColumn,import_id) values ('someValue4',1) on duplicate key update someColumn = 'someValue4';

其中第一个和最后一个插入表示旧表的插入,第二个和第三个表示来自其他地方的插入。

希望这会有所帮助并祝你好运!