“现有记录可能具有基于给定 4 个字段的重复记录,即两个或多个有效交易的帐户、日期、金额和详细信息的相同值,但可以肯定这些记录即使具有重复值也是有效的。”
但是,如果加载的数据或源文件中没有唯一性标记,那么任何人都怎么知道呢?有效性甚至意味着什么?
“现在为了加载丢失的记录,我们需要确定一条记录是否已经加载,这样我们就不会加载已经加载的记录。”
如果没有现有的独特性来源,您将无法做到这一点。因为它对于给定的组合有两行,(Account, Date, Amount, Particulars)
没关系,确定(帐户,日期,金额,详细信息)的第三个实例是已经加载的记录的规则是什么,因此无效,或者记录尚未加载,因此有效。
“所以,对我来说,很难知道是否已经根据这些字段加载了记录。我认为它超出了这些字段的限制”
您说得对,在您描述的数据中找不到解决方案。但解决方案其实很简单。你去找那些断言加载记录的有效性的人,并向他们提供这些附加记录的列表。他们将能够使用他们的技能和判断力告诉您哪些记录是有效的,然后您加载这些记录。
“找到解决办法是我的职责”
不,这不是你的职责。目前,数据所有者肩负着准确定义其数据集的责任,其中包括识别业务密钥。他们是那些取消他们的责任的人。
在这种情况下,您有三个选择:
- 在数据所有者履行职责之前,拒绝加载任何进一步的记录。
- 加载提供给您的所有记录以供加载,无需任何验证。
- 使用可怕的 NOVALIDATE 语法。
NOVALIDATE 是一种对未来行强制执行验证规则但忽略现有数据中的违规行为的方法。基本上,这是解决政治问题的技术问题。
SQL> select * from t23
/
COL1 COL2
---------- --------------------
1 MR KNOX
1 MR KNOX
2 FOX IN SOCKS
2 FOX IN SOCKS
SQL> create index t23_idx on t23(col1,col2)
/
Index created.
SQL> alter table t23 add constraint t23_uk
unique (col1,col2) novalidate
/
Table altered.
SQL> insert into t23 values (2, 'FOX IN SOCKS')
/
insert into t23 values (2, 'FOX IN SOCKS')
*
ERROR at line 1:
ORA-00001: unique constraint (APC.T23_UK) violated
SQL>
请注意,您需要在添加约束之前预先创建一个非唯一索引。如果你不这样做,数据库将建立一个唯一索引,这将覆盖 NOVALIDATE 子句。
我将 NOVALIDATE 描述为可怕,因为它确实如此。它将数据损坏烘焙到数据库中。但这是最接近解决方案的事情。
这种方法完全忽略了“有效性”的概念。因此它将拒绝可能应该加载的记录,因为它们代表“有效”第 n 次出现 (Account, Date, Amount, Particulars)
. 这是不可避免的。好消息是,没有人能说出来,因为没有明确的规则来确定有效性。
无论您选择什么选项,您都必须向您的老板、数据所有者、数据所有者的老板以及您认为合适的任何其他人清楚地解释清楚,并获得他们的书面同意继续进行,这一点至关重要。否则,有时人们会发现数据库中充满了重复的行,或者有人会抱怨没有加载“有效”记录,这都是你的错......除非你有一个签名的获得相应上层黄铜授权的纸张。
祝你好运
Haki 使用 MERGE 的建议与 NOVALIDATE 具有相同的效果,因为它会加载新记录并抑制所有重复项。然而,它更像是一个杂牌:它根本没有解决唯一性的概念。任何拥有 INSERT 或 UPDATE 访问权限的人仍然可以拥有他们喜欢的任何行。因此,这种方法只有在您可以完全锁定该表的权限以便其数据只能通过 MERGE 而不能通过其他 DML 操作时才有效。取决于持续的独特性是否重要。再次,商业决策。