mysql - 如何减少基于非键列的重复行插入?

标签 mysql insert duplicates data-transfer data-import

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

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

这个问题越想越觉得应该在最初的SELECT中处理。但是,我对一般处理此问题的质量机制感兴趣。

最好的。

最佳答案

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

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

希望这对您有所帮助,祝您好运!

关于mysql - 如何减少基于非键列的重复行插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7572475/

相关文章:

MYSQL 日期范围和时间范围

php - 这个sql语法有什么问题?

python - 在列表中的每个项目之后插入一个项目(Python)

c++ - 如何通过全名从双向链表中删除重复项

mysql - MySQL 数据库表中日期和客户的第一行和最后一行

php - 带有while循环的mysql Node js动态数组

java - 如何使用 ProcessBuilder 运行 MySQL 脚本?

php - 插入获取数组数据到新数据库

linux - 在使用 SED 命令添加之前检查文件中是否存在新行

linux - 如何使用unix获取具有重复行的txt文件中的唯一值(行)?