我的数据库里有将近300万份金融交易记录。这些记录是从包含以下字段的外部文件中加载的,这些字段映射到表的列。
Account, Date, Amount, Particulars/Description/Details/Narration
现在需要保持已经加载的记录和未来记录的唯一性。
由于已经加载的外部文件没有唯一性,所以我认为,我们必须使用给定的字段创建唯一的键来更新现有的记录,但是很明显,外部文件中的字段可能会重复。
如何保持这样的唯一性,以便我们可以从文件中识别事务已经加载。欢迎所有类型的建议。
编辑1
当前已加载的记录被确认为有效,由于从旧文件或丢失的文件加载了一些丢失的记录,因此需要保持唯一性。
编辑2
现有记录可能有基于给定的4个字段的重复记录,即两个或两个以上有效交易的帐户值、日期、金额和详情相同,但即使有重复的值,这些记录也是有效的。
现在,为了加载丢失的记录,我们需要识别记录是否已经加载,这样我们就不会加载已经加载的记录。因此,在我看来,很难知道是否已经根据这些字段加载了记录。我认为这超出了这些领域的范围。
编辑3
的情况现在已经改变了,这已经不再是一个有效的问题了,但是最好把它留给其他人。已同意在记录中添加一个唯一的密钥,从而检查此密钥是否复制。
发布于 2013-07-08 23:04:53
Note -在OP中做了一些澄清之后,这个答案与他们的场景无关。这是一个政治或商业问题,而不是一个技术性问题。我将把这个答案作为一个假设性问题的解决办法,因为它可能对一些未来的寻求者仍有帮助。
我的另一个回应解决了OP的实际情况。
似乎你需要一个独特的复合键:
alter table your_table add constraint your_table_uk
unique (Account, Date, Amount, Particulars)
using index
particulars
作为惟一性的来源似乎有点模糊,但在任何给定的一天内,一个帐户都可能有多个事务处理相同的金额,因此您需要所有四个列来保证行的唯一性。
或者,正如@yper多维数据集所暗示的那样,只有(Account, Date, Particulars)
是必需的。
我建议使用唯一的键,而不是主键约束,因为在执行外键时,复合主键是坏消息。在这种情况下,我建议您添加一个由序列填充的合成主键。
您可以说加载的记录是有效的,但是如果不是这样的话,请将ALTER语句更改为使用EXCEPTIONS子句查找重复的行。您将使用一个特殊的表来捕获违反约束的行为。了解更多信息。
发布于 2013-07-08 23:40:31
现有记录可能有基于给定的4个字段的重复记录,即两个或两个以上有效交易的帐户价值、日期、金额和详情相同,但即使有重复的值,这些记录也是有效的。
但是,如果在加载的数据或源文件中没有唯一的标记,任何人如何判断呢?有效性到底意味着什么?
“现在,对于加载丢失的记录,我们需要确定记录是否已经加载,这样我们就不会加载已经加载的记录。”
如果没有现有的唯一性源,您就无法做到这一点。因为对于给定的(Account, Date, Amount, Particulars)
组合,它有两行--这是可以的,确定第三个实例(帐户、日期、金额、细节)的第三个实例是已经加载的记录,因此是无效的,或者记录没有加载,因此是有效的。
因此,在我看来,很难知道是否已经基于这些字段加载了记录。我认为它超出了这些字段的范围
您正确地说,在您描述的数据中找不到解决方案。但解决办法其实很简单。您将找到断言已加载记录的有效性的人员,并向他们提供这些附加记录的列表。他们将能够使用他们的技能和判断力来告诉你哪些记录是有效的,然后你加载这些记录。
“找到解决办法是我的责任”
不,这不是你的职责。现在,数据所有者有责任准确地定义他们的数据集,这包括识别业务密钥。他们是免除责任的人。
在这种情况下,你有三个选择:
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子句。
我把它描述为可怕的,因为它是可怕的。它会将数据损坏到数据库中。但这是你能找到的最接近的解决方案。
这种做法完全忽视了“有效性”的概念。因此,它将拒绝可能应该加载的记录,因为它们表示(Account, Date, Amount, Particulars)
的“有效”第n次出现。这是不可避免的。好消息是,没有人能够知道,因为没有明确的规则来确定有效性。
无论你选择什么选择,你都必须向你的老板、数据所有者、数据所有者的老板以及你认为合适的人解释清楚,并得到他们的书面同意。否则,有时人们会发现数据库中充满了重复的行,或者有人会抱怨没有加载“有效”记录,这都是您的错.除非你有一张由适当的高层授权签署的文件。
祝好运
Haki关于使用合并的建议具有与NOVALIDATE相同的效果,因为它将加载新记录并抑制所有重复记录。然而,这更像是一种模棱两可的说法:它根本不涉及唯一性的概念。任何具有插入或更新访问权限的人仍然能够拥有他们喜欢的任何行。因此,只有当您能够完全锁定该表上的特权,以便它的数据只能通过合并而不是其他DML操作时,这种方法才能起作用。取决于持续的独特性是否重要。再一次,商业决策。
发布于 2013-07-08 23:44:14
听起来你需要重新插入-或者甲骨文称它为MERGE
。
两个表之间的MERGE
操作允许您处理两种常见的情况-
https://stackoverflow.com/questions/17541511
复制相似问题