插入或更新到没有主键的表

时间:2018-08-21 00:26:32

标签: mysql sql database

我继承了一个具有基本数据的表,该表基本上是这样的:

person_id   first   last   activity_date
----------------------------------------
98765       Dan     Jones  2018-06-15
12345       Mary    Smith  2018-07-04
12345       Mary    Smith  2018-07-04
21212       Erin    Mark   2018-08-11

两个主要挑战是:

  1. 它没有主键,并且
  2. 可以有重复的行

供应商将定期为CSV提供更新后的数据,我需要将其添加到此现有表中。这带来了另外两个挑战:

  1. 新文件不能完全替代表中的现有数据,并且
  2. 新文件可能与表中现有数据的一部分重叠。

例如:

person_id   first   last   activity_date
----------------------------------------
12345       Mary    Smith  2018-07-04
12345       Mary    Smith  2018-07-04
21212       Erin    Mark   2018-08-11
87878       Tom     Davis  2018-08-12

问题就变成了,面对所有这些挑战,我该如何更新表格?

我的本​​能是创建一个重复表,添加新数据,然后使用查询来识别重叠和空白。 MySQL中缺少EXCEPT命令,这使它成为一个挑战。可能存在重复的行的事实也是如此。

任何人都可以建议我可能需要从我要插入数据库的CSV中识别缺少的行的SQL吗?

1 个答案:

答案 0 :(得分:1)

我将按照您的描述创建一个新的重复表,并添加一个auto_increment id字段作为主键:

CREATE TABLE table2
    (id int auto_increment primary key,
     `person_id` int,
     `first` varchar(20),
     `last` varchar(20), 
     `activity_date` date)

为此创建一个唯一的密钥:

alter table table2 add unique key (`person_id`, `first`, `last`, `activity_date`);

然后使用IGNORE插入所有数据,以跳过所有重复的数据:

insert ignore into table2 (`person_id`, `first`, `last`, `activity_date`)
select * from table1

从供应商处获取CSV文件时,再次使用LOAD DATA INFILEIGNORE选项,这将仅从数据库中不存在的CSV文件中导入数据。