【问题标题】:Trigger to skip certain inserts during LOAD DATA INFILE在 LOAD DATA INFILE 期间触发以跳过某些插入
【发布时间】:2012-08-03 02:35:55
【问题描述】:

首先,一个简化版本:我想知道我是否可以创建一个触发器以在 INSERT 期间激活(实际上是 LOAD DATA INFILE),而不是在我的表中输入 RMA 的记录?

我有一个没有唯一记录的表。有些可能是合法的重复项,但我可以使用一个字段来了解数据是否已输入。比如

RMA     Op     Days
---------------------
213   Repair   0.10
213    Test    0.20
213   Repair   0.10

因此,我可以一起对三列进行索引,但正如您所见,RMA 可能会在同一步骤中出现两次相同的时间,因此可能会有重复的记录。基本上,我希望触发器说明 NEW.rma 是否已经在表中,跳到下一行。

我发现有一些方法可以让触发器停止插入,所以我想我现在的问题是,如何在 LOAD DATA INFILE 调用期间跳过插入并继续其余部分?

【问题讨论】:

  • 该格式不适用于我的示例。基本上有 3 列(RMA - Op - Days)显示发货的 RMA 在该操作步骤中花费了多少天。

标签: mysql triggers load-data-infile


【解决方案1】:

不需要使用锁表...这样做(我是说表名是rmainfo):

create table rmainfo_new like rmainfo;
load data infile 'filename' into table rmainfo_new;
rename table rmainfo to rmainfo_old,rmainfo_new to rmainfo;
drop table rmainfo_old;

您也可以将删除表放在开头(设为DROP TABLE IF EXISTS rmainfo_old),这将在运行之间留下 _old 表以供备份/参考

【讨论】:

    【解决方案2】:

    您能否设置一个从 RMA 和 OP 派生的复合密钥?这会导致重复的条目显示为错误。

    【讨论】:

    • 重复条目不是错误,这是我的问题。帖子中看到的数据是有效条目的样子。我不想要的是第二次输入这三行。我有一个运行 Excel 文件的自动报告,该文件从 Oracle 查询报告,然后将数据插入到我的数据库中。它从当月的第一天到当前日期运行并运行 LOAD DATA INFILE。对于我的其他报告,它工作正常,因为 LOAD DATA INFILE 会跳过重复项,但这里 LOAD DATA INFILE 无法知道,所以我必须以某种方式抓住它。
    • 我总是从运行上次报告时开始运行,但有时我从 Oracle 报告查询中收到错误,因此我并不总是确定它上次运行的确切时间,并且加载本月至今的所有数据更容易。
    【解决方案3】:

    我能想到的最简单的方法是加载到一个新表中,然后删除旧表并重命名新表。 LOCK TABLES 应该能够在最后隔离那个开关。

    或者,如果您确定行在插入文件中出现的顺序 - 即,如果保证文件有旧行后跟新行 - 那么您可以先COUNT(*),然后跳过加载时的行数。

    【讨论】:

      猜你喜欢
      • 2015-03-11
      • 1970-01-01
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 2012-09-02
      相关资源
      最近更新 更多