2010-05-25 73 views
0

首先,简化版本:我想知道是否可以在INSERT(实际上是LOAD DATA INFILE)期间创建触发器来激活,并且不会为我的表中已经存在的RMA输入记录?触发在LOAD DATA INFILE期间跳过某些插入

我有一个没有独特记录的表。有些可能是合法的重复,但有一个字段可用于了解数据是否已输入。例如

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

所以我可以做三列的索引在一起,但是当你看到它的可能的RMA是在同一时间量内进行二次所以它可能有重复的记录。基本上,我想让Trigger说如果NEW.rma已经在表格中,请跳到下一行。

我发现有办法使触发器暂停插入,所以我想我现在的问题是,如何跳过插入并在LOAD DATA INFILE调用期间继续休息?

+0

格式不适用于我的示例。基本上有3列(RMA - Op - Days)表明RMA在该操作步骤中花费了多少天。 – Geoff 2010-05-25 16:03:32

回答

0

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

+0

重复项不是错误,这是我的问题。在帖子中看到的数据是一个有效的条目。但我不想要的是为了再次输入这三行。 我有一个自动化的报告运行Excel文件,从Oracle查询报告,然后将数据插入到我的数据库。它从当前月份的第一个运行到当前日期并运行LOAD DATA INFILE。与我的其他报告,它工作正常,因为LOAD DATA INFILE将跳过重复,但在这里没有办法让LOAD DATA INFILE知道,所以我必须以某种方式捕捉它。 – Geoff 2010-05-25 16:57:50

+0

我总是从运行上次报告时开始运行,但有时候我会从Oracle报告查询中收到错误,所以我并不总是确定它最后运行的确切时间,并且它更容易加载所有数据本月至今。 – Geoff 2010-05-25 16:58:53

0

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

或者,如果您确信行在插入文件中出现的顺序 - 即,如果确保该文件具有旧行,然后是新行 - 则可以先执行COUNT(*),然后跳过加载时的行数。

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开头(使其DROP TABLE IF EXISTS rmainfo_old)这将使运行之间的_old表保留备份/参考