通过脚本仅在MySQL中添加新记录

通过脚本仅在MySQL中添加新记录,mysql,sql,perl,optimization,query-optimization,Mysql,Sql,Perl,Optimization,Query Optimization,我有一个大型数据库,我正试图通过perl更新它。要添加的信息来自一个csv文件,我不控制该文件(但该文件是可信的,它来自我们公司的不同部分)。对于文件中的每个记录,我需要添加它(如果它不存在)或不执行任何操作(如果它存在)。添加记录包括通常的插入,但在为特定条目运行之前,必须运行特定的更新 假设为了具体起见,该文件有10000个条目,但其中90%已经在数据库中。导入记录的最有效方法是什么?我可以看到一些明显的方法: 从数据库中提取此类型的所有记录,然后检查文件中的每个条目的成员资格。缺点:大量

我有一个大型数据库,我正试图通过perl更新它。要添加的信息来自一个csv文件,我不控制该文件(但该文件是可信的,它来自我们公司的不同部分)。对于文件中的每个记录,我需要添加它(如果它不存在)或不执行任何操作(如果它存在)。添加记录包括通常的
插入
,但在为特定条目运行之前,必须运行特定的
更新

假设为了具体起见,该文件有10000个条目,但其中90%已经在数据库中。导入记录的最有效方法是什么?我可以看到一些明显的方法:

  • 从数据库中提取此类型的所有记录,然后检查文件中的每个条目的成员资格。缺点:大量数据传输,可能足以使服务器超时
  • 读取文件中的条目,并使用类似“foo | bar | baz |…”的
    query(或
    stuff='foo'| stuff='bar'|查询,但这似乎更糟)发送对这些记录的查询。缺点:庞大的查询,可能足以阻塞服务器
  • 读入该文件,为每个条目发送查询,然后根据需要添加查询。缺点:数以万计的查询,速度非常慢

除了
更新
要求之外,这似乎是一个相当标准的问题,大概有一个标准的解决方案。如果有,,它可能适合我的情况,可以适当使用
自动增量
主键上的测试。

如果在迭代列表时不断刷新数据,则无需超时服务器。

如果在迭代列表时不断刷新数据,则无需超时服务器。

标准解决方案是使用
INSERT IGNORE
,如果由于约束导致插入失败,则不会引发错误。这对您没有多大用处,因为在您知道
INSERT
将起作用之前,它不会给您机会进行
UPDATE
。但是,如果您可以在之后进行更新,这是理想的:只需插入忽略每条记录,然后在成功后执行更新

如果一条记录已经存在,这意味着数据库中已经存在一条具有匹配唯一键的记录,因此我不理解类似
RLIKE
的建议,这肯定会很慢

我将使用Perl对每个记录使用表中的
选择count(*),其中key=?
,并删除结果为非零的任何内容,来grep CSV文件


然后只需对过滤后的CSV数据中剩下的所有内容执行
更新
插入

标准解决方案是使用
插入忽略
,如果插入因约束而失败,则不会引发错误。这对您没有多大用处,因为在您知道
INSERT
将起作用之前,它不会给您机会进行
UPDATE
。但是,如果您可以在之后进行更新,这是理想的:只需插入忽略每条记录,然后在成功后执行更新

如果一条记录已经存在,这意味着数据库中已经存在一条具有匹配唯一键的记录,因此我不理解类似
RLIKE
的建议,这肯定会很慢

我将使用Perl对每个记录使用表中的
选择count(*),其中key=?
,并删除结果为非零的任何内容,来grep CSV文件


然后只需对过滤后的CSV数据中剩下的所有内容执行
UPDATE
INSERT

不过,我输入的字段都不是主键。主键是我提到的
auto_increment
字段。因此,
UPDATE IGNORE
不起作用。如果存在与我插入的字段匹配的记录。因此,如果我有
插入tbl(foo,bar,baz)值('f','b','b')
我不想在有foo='f',bar='b'和baz='b'项的情况下添加记录。@Charles:那么我会
改变tbl表,添加唯一索引(foo,bar,baz)
然后
将IGNORE插入tbl
。不幸的是,这不是一个选项:数据库由一个(大型)外部应用程序使用,该应用程序要求表按现在的布局。不过,我输入的字段都不是主键。主键是我提到的
auto_increment
字段。因此,
UPDATE IGNORE
不起作用。如果存在与我插入的字段匹配的记录。因此,如果我有
插入tbl(foo,bar,baz)值('f','b','b')
我不想在有foo='f',bar='b'和baz='b'项的情况下添加记录。@Charles:那么我会
改变tbl表,添加唯一索引(foo,bar,baz)
然后
将IGNORE插入tbl
。不幸的是,这不是一个选项:数据库由一个(大型)外部应用程序使用,该应用程序要求表按现在的布局。