【问题标题】:How do I mitigate duplicate row inserts based on a non-key column?如何减轻基于非键列的重复行插入?
【发布时间】:2011-11-26 05:07:10
【问题描述】:

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

我现在的问题是,我实际上如何防止重复?由于新系统与旧系统并行推出,因此很遗憾需要多次运行导入。我无法将“import_id”字段设置为 PK/UNIQUE,因为对于不是来自旧表的字段,它将具有空值,从而在添加新字段时引发错误。有没有办法对本身没有约束的任意列即时使用某种类型的 INSERT IGNORE?

我越想这个问题,我越觉得我应该在最初的 SELECT 中处理它。不过,我会对处理这个问题的质量机制感兴趣。

最好的。

【问题讨论】:

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


    【解决方案1】:

    您应该能够在 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';
    

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

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

    【讨论】:

    • 无论出于何种原因,我的印象是您不能拥有 NULL 唯一字段。感谢您的帖子。
    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 2017-01-31
    • 2017-12-29
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 2023-03-07
    • 2023-02-10
    相关资源
    最近更新 更多