首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >保持记录的唯一性

保持记录的唯一性
EN

Stack Overflow用户
提问于 2013-07-08 22:34:33
回答 3查看 194关注 0票数 0

我的数据库里有将近300万份金融交易记录。这些记录是从包含以下字段的外部文件中加载的,这些字段映射到表的列。

代码语言:javascript
运行
AI代码解释
复制
Account, Date, Amount, Particulars/Description/Details/Narration

现在需要保持已经加载的记录和未来记录的唯一性。

由于已经加载的外部文件没有唯一性,所以我认为,我们必须使用给定的字段创建唯一的键来更新现有的记录,但是很明显,外部文件中的字段可能会重复。

如何保持这样的唯一性,以便我们可以从文件中识别事务已经加载。欢迎所有类型的建议。

编辑1

当前已加载的记录被确认为有效,由于从旧文件或丢失的文件加载了一些丢失的记录,因此需要保持唯一性。

编辑2

现有记录可能有基于给定的4个字段的重复记录,即两个或两个以上有效交易的帐户值、日期、金额和详情相同,但即使有重复的值,这些记录也是有效的。

现在,为了加载丢失的记录,我们需要识别记录是否已经加载,这样我们就不会加载已经加载的记录。因此,在我看来,很难知道是否已经根据这些字段加载了记录。我认为这超出了这些领域的范围。

编辑3

的情况现在已经改变了,这已经不再是一个有效的问题了,但是最好把它留给其他人。已同意在记录中添加一个唯一的密钥,从而检查此密钥是否复制

EN

回答 3

Stack Overflow用户

发布于 2013-07-08 23:04:53

Note -在OP中做了一些澄清之后,这个答案与他们的场景无关。这是一个政治或商业问题,而不是一个技术性问题。我将把这个答案作为一个假设性问题的解决办法,因为它可能对一些未来的寻求者仍有帮助。

我的另一个回应解决了OP的实际情况。

似乎你需要一个独特的复合键:

代码语言:javascript
运行
AI代码解释
复制
alter table your_table add constraint your_table_uk
    unique (Account, Date, Amount, Particulars)
    using index

particulars作为惟一性的来源似乎有点模糊,但在任何给定的一天内,一个帐户都可能有多个事务处理相同的金额,因此您需要所有四个列来保证行的唯一性。

或者,正如@yper多维数据集所暗示的那样,只有(Account, Date, Particulars)是必需的。

我建议使用唯一的键,而不是主键约束,因为在执行外键时,复合主键是坏消息。在这种情况下,我建议您添加一个由序列填充的合成主键。

您可以说加载的记录是有效的,但是如果不是这样的话,请将ALTER语句更改为使用EXCEPTIONS子句查找重复的行。您将使用一个特殊的表来捕获违反约束的行为。了解更多信息

票数 1
EN

Stack Overflow用户

发布于 2013-07-08 23:40:31

现有记录可能有基于给定的4个字段的重复记录,即两个或两个以上有效交易的帐户价值、日期、金额和详情相同,但即使有重复的值,这些记录也是有效的。

但是,如果在加载的数据或源文件中没有唯一的标记,任何人如何判断呢?有效性到底意味着什么?

“现在,对于加载丢失的记录,我们需要确定记录是否已经加载,这样我们就不会加载已经加载的记录。”

如果没有现有的唯一性源,您就无法做到这一点。因为对于给定的(Account, Date, Amount, Particulars)组合,它有两行--这是可以的,确定第三个实例(帐户、日期、金额、细节)的第三个实例是已经加载的记录,因此是无效的,或者记录没有加载,因此是有效的。

因此,在我看来,很难知道是否已经基于这些字段加载了记录。我认为它超出了这些字段的范围

您正确地说,在您描述的数据中找不到解决方案。但解决办法其实很简单。您将找到断言已加载记录的有效性的人员,并向他们提供这些附加记录的列表。他们将能够使用他们的技能和判断力来告诉你哪些记录是有效的,然后你加载这些记录。

“找到解决办法是我的责任”

不,这不是你的职责。现在,数据所有者有责任准确地定义他们的数据集,这包括识别业务密钥。他们是免除责任的人。

在这种情况下,你有三个选择:

  1. 在数据所有者履行职责之前,拒绝加载任何进一步的记录。
  2. 加载提交给您的所有记录以供加载,无需任何验证。
  3. 使用可怕的NOVALIDATE语法。

NOVALIDATE是一种对未来行强制执行验证规则的方法,但忽略了现有数据中的冲突。基本上,这是一个政治问题的技术假造。

代码语言:javascript
运行
AI代码解释
复制
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操作时,这种方法才能起作用。取决于持续的独特性是否重要。再一次,商业决策。

票数 1
EN

Stack Overflow用户

发布于 2013-07-08 23:44:14

听起来你需要重新插入-或者甲骨文称它为MERGE

两个表之间的MERGE操作允许您处理两种常见的情况-

  1. 该记录已经存在于目标表中,我需要对它做一些事情--要么更新要么什么也不做。
  2. 目标表中不存在记录-插入它。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17541511

复制
相关文章
Xamarin使用ListView开启分组视图Cell数据展示bug处理
问题描述 Xamarin使用IsGroupingEnabled="true"之后再Cell操作就会出现数据展示bug,数据不刷新的问题,如下图所示: 点击取消的是其他钢厂,但ViewCell展示的一直
磊哥
2018/05/08
6670
Xamarin使用ListView开启分组视图Cell数据展示bug处理
xamarin android listview的用法
listview也许是用的非常频繁的一个控件之一,下面我写一个xamarin的listview栗子,大家尝一尝xamarin android开发的乐趣。原谅我的大小写吧.
全栈程序员站长
2022/09/15
8900
xamarin android listview的用法
winfrom如何在listview中添加控件
private Button btn = new Button(); private void Form1_Load(object sender, EventArgs e) { ListViewItem[] lvs = new ListViewItem[3]; lvs[0] = new ListViewItem(new string[] { "行1列1", "行1列2", "" }); l
码农阿宇
2018/04/18
2.6K0
如何在JavaScript中处理大量数据
在几年之前,开发人员不会去考虑在服务端之外处理大量的数据。现在这种观念已经改变了,很多Ajax程序需要在客户端和服务器端传输大量的数据。此外,更新DOM节点的处理在浏览器端来看也是一个很耗时的工作。而且,需要对这些信息进行分析处理的时候也很可能导致程序无响应,浏览器抛出错误。 将需要大量处理数据的过程分割成很多小段,然后通过JavaScript的计时器来分别执行,就可以防止浏览器假死。先看看怎么开始: function ProcessArray(data,handler,callback){ Process
CSDN技术头条
2018/02/09
3.1K0
flutter - 如何在SingleChildScrollView中实现非滚动 ListView
我试图在这里实现一个不可滚动的ListView构建器,但似乎找不到解决方法。原因是因为我希望所有内容都是可滚动的,并且我不想在可滚动的父级中拥有可滚动的小部件。
徐建国
2021/08/03
2.5K0
在Excel中处理和使用地理空间数据(如POI数据)
因为不是所有规划相关人员,都熟悉GIS软件,或者有必要熟悉GIS软件,所以可能我们得寻求另一种方法,去简单地、快速地处理和使用地理空间数据——所幸,我们可以通过Excel自带的“三维地图”功能来简单满足一些差不多够用的需求。
Sidchen
2020/08/02
11K0
Angular 表单2--响应式表单, 处理异步数据
上一节中我们定义了一个响应式表单,其中表单数据是在定义的时候就初始化好的,但是很多时候数据需要异步获取,比如 打开一个编辑页面,需要
mafeifan
2019/03/08
2.8K0
android中listview分页载入数据
前段时间做的新浪微博项目一直想实现listview分页载入数据,今天最终实现了,哈哈!感觉挺好的,今天又写了个demo给大家分享下。
全栈程序员站长
2022/07/14
9790
android中listview分页载入数据
Vue3中表单相关的知识:表单绑定、表单验证、表单处理
表单是前端开发中经常使用的一种交互方式,它提供了一种用户输入和提交数据的机制。Vue3作为一款流行的JavaScript框架,提供了丰富的表单处理功能,使得我们能够轻松地创建、验证和获取表单数据。本文将详细介绍Vue3中表单相关的知识,包括表单绑定、表单验证、表单处理等方面。
网络技术联盟站
2023/07/05
3K0
Xamarin.Forms入门-使用 Xamarin.Forms 来创建跨平台的用户界面
Xamarin.Forms 是一个跨平台的、基于原生控件的UI工具包,开发人员可以轻松的创建适用于 Android,iOS 以及 Windows Phone的用户界面。Xamarin.Forms 通过使用平台的原生控件来渲染用户界面,使用 Xamarin.Forms 的 App在外观上与平台完全一致。通过本文您可以快速了解如何使用 Xamarin.Form 来进行应用程序的开发。 简介 Xamarin.Forms可以帮助开发人员快速的构建跨平台的UI,通过一次编码,生成多平台界面。如果你做的工作涉及到三个平
葡萄城控件
2018/01/10
13.1K0
Xamarin.Forms入门-使用 Xamarin.Forms 来创建跨平台的用户界面
windows_清空listview中的数据
winfrom调用的浏览器默认内核是ie的,这在当下是很受限制的,前几年的webkit还是挺不错的,可惜停止维护和更新了,当下使用webkit不免也有些不兼容;
全栈程序员站长
2022/09/28
1.4K0
windows_清空listview中的数据
Flutter 中 ListView 动态数据生成列表
1. 循环数据,生成列表效果。 import 'package:flutter/material.dart'; void main(){ runApp(MyApp()); } // 抽离成一个单独的组件 class MyApp extends StatelessWidget{ @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold(
越陌度阡
2020/12/22
3.3K0
Flutter 中 ListView 动态数据生成列表
Flutter中ListView 动态数据生成列表
1. 循环数据,生成列表效果。 import 'package:flutter/material.dart'; void main(){ runApp(MyApp()); } // 抽离成一个单独的组件 class MyApp extends StatelessWidget{ @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold(
越陌度阡
2022/05/06
1.7K0
Flutter中ListView 动态数据生成列表
如何在Java中处理JSON
New 一个 ObjectMapper对象,后续将利用这个ObjectMapper对象来进行一系列的操作。
泰坦HW
2020/07/22
1.6K0
Flask表单处理
在Web应用程序中,表单是非常常见的元素,用户可以通过表单来输入数据并将其提交到服务器。在Flask中,您可以使用Flask-WTF扩展来轻松地处理表单。
堕落飞鸟
2023/05/05
1.1K2
如何在代码中处理时间
在国际化应用中,对日期/时间的处理远比你想象中的更难,特别是当涉及到时区的时候。为什么会这么难?我们该如何解决它?请听我为你一一解析。几乎所有的系统都离不开“时间”的概念,以至于大多数语言(及其默认库)都定义了日期/时间等类型。但是,我们日常所说的“时间”这个词实际上包含了多个相似却有微妙差异的概念。如果不能分清它们,会给你的开发工作带来很多烦恼。
ThoughtWorks
2021/09/15
1.6K0
listview优化(中)
1,对Imageview使用setTag()方法来解决图片错位问题,这个Tag中设置的是图片的url,然后在加载的时候取得这个url和要加载那position中的url对比,如果不相同就加载,相同就是复用以前的就不加载了 2,对于要加载的图片资源,先在内存缓存中找(原始的方法是使用SoftRefrence,最新的方法是使用android提供的Lrucache),如果找不到,则在本地缓存(可以使用DiskLrucache类)中找(也就是读取原先下载过的本地图片),还找不到,就开启异步线程去下载图片,下载以
xiangzhihong
2018/01/30
1.1K0
JavaScript 表单处理
为了分担服务器处理表单的压力,JavaScript提供了一些解决方案,从而大大打破了处处依赖服务器的局面。 一.表单介绍 在HTML中,表单是由<form>元素来表示的,而在JavaScript中,表单对应的则是HTMLFormElement类型。HTMLFormElement继承了HTMLElement,因此它拥有HTML元素具有的默认属性,并且还独有自己的属性和方法: HTMLFormElement属性和方法 属性或方法 说明 acceptCharset 服务器能够处理
汤高
2018/01/11
4.9K0
点击加载更多

相似问题

为Chrome安装IcedTeaPlugin

10

为Android安装Ubuntu

20

为Nvidia GPU安装OpenCL

10

为14.04安装CryptoTE (可靠)

10

为Ubuntu 15.04安装Skype

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文