Oracle如何防止插入相同数据?

设计的表是没有主键的,也就是可能会有很多相同的数据,初衷是因为每台终端每五分钟上传一条数据(包含终端的ID,IP,端口等数据,也就是随时会变的数据,除了终端ID)分别保存到四张表,而每张表用终端ID关联查询。如果设自增主键感觉没有必要,因为可能除了这个主键其他数据都相同,而且不好关联查询。

现在具体想要问的是:如何让oracle在没有主键的情况下有完全相同的一条记录时不插入数据?

Merge需要on和id,where not exist也是相同情况,

不知道还有什么方法?需要重新设计数据库吗?

4个回答

初衷是因为每台终端每五分钟上传一条数据

感觉逻辑有点问题,上传时间应该是不会一样的,所以对于一个终端来说,是不是重复只需要判断上传时间就可以了

guangcaiwudong
Kevin.Y.K 回复CCCCCCCYYY_: 单纯判断重复没有什么好的办法,你用不上索引就是全表扫描。只能选择不同的方案,第一种先入库后清洗,然后数据也有生命周期的;第二种是比较后入库,批量处理,先把新数据放入“临时表”,然后和主表关联匹配入库,清理临时表
9 个月之前 回复
ccystewart
CCCCCCCYYY_ 回复Kevin.Y.K: 因为有十几个字段要保存判断,我怕数据库后面吃不消了会很慢
9 个月之前 回复
ccystewart
CCCCCCCYYY_ 回复Kevin.Y.K: 就是想问问大佬们sql有没有更便捷的方法哈哈。
9 个月之前 回复
ccystewart
CCCCCCCYYY_ 回复Kevin.Y.K: 嗯,一开始也考虑插入时间这个判断,但是又想到终端五分钟上传一条,四百多台终端,如果每条都保存下来数据库很快破百万
9 个月之前 回复
guangcaiwudong
Kevin.Y.K 回复CCCCCCCYYY_: 这不是一个技术问题,是一个业务处理问题,如果是对于数据采集,上传时间不一样一般都是需要存储下来的,如果你的业务只需要一条,那也要区分是存储最开始的数据,还是最新时间的数据。 至于数据重复判断,就直接查询你需要比较的字段是否相同,再插入就行了
9 个月之前 回复
sinat_41201574
sinat_41201574 对啊 那你就按照其它几个字段的值查询是否存在就行了呀,时间不影响
9 个月之前 回复
ccystewart
CCCCCCCYYY_ 确实上传时间是不一样,但是如果其他数据如终端ID、IP地址、端口、ftp地址是一样的情况下,这条数据我就觉得没有保存的必要了- -
9 个月之前 回复

加个索引约束行吗,需要判断的几个字段加联合唯一索引

qq_38971349
我的萨摩耶贼凶 这才是最好的啊。直接加个唯一约束就可以啊
9 个月之前 回复

逻辑很简单啊。在插入之前先查询是否存在相同数据,如果存在则插入,不存在则不插入,
程序和sql都可以处理图片说明

ccystewart
CCCCCCCYYY_ 就是想问下sql咋写哈哈。merge需要用id来找,没主键好像行不通
9 个月之前 回复

先查询是否存在相同数据

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐