Oracle 是否有类似的检查约束帮助我知道是否存在重复列

Oracle 是否有类似的检查约束帮助我知道是否存在重复列,oracle,Oracle,表1 ID-name-main_number-random1-random2 1*-aaaa blalablabla*-***-* 2-vvvv蓝光*-***-* 3-aaaa blalablabla*-***-*** ID、名称和主编号是主键 我的问题是我注意到coulmn name和main number有重复值,我不想添加任何其他重复值(我应该保留旧的重复值,因为在我的真实表中有很多重复数据,很难删除它们) 当我试图(在提交之前)知道我试图插入的名称是重复的时,我想要的是什么 我可以在过

表1
ID-name-main_number-random1-random2
1*-aaaa blalablabla*-***-*
2-vvvv蓝光*-***-*
3-aaaa blalablabla*-***-***


ID、名称和主编号是主键
我的问题是我注意到coulmn name和main number有重复值,我不想添加任何其他重复值(我应该保留旧的重复值,因为在我的真实表中有很多重复数据,很难删除它们)
当我试图(在提交之前)知道我试图插入的名称是重复的时,我想要的是什么
我可以在过程或触发器中实现这一点,但我听说约束检查越来越简单(如果有更简单的方法,那么过程或触发器将乐于学习)

约束检查\u名称
检查(名称=(A_名称))

以这种方式常量可以有多于1列吗

约束检查\u名称
检查(名称=(A_名称),主编号=(A_编号))

我能用这种方式写一个常数吗

约束检查\u名称
选中(名称=(选择有列具有相同列名值的情况))


所以我的问题是:simelar有没有办法检查约束以帮助我知道是否存在重复的列或者我必须使用触发器?

是的,可以在许多列上使用约束

但在这种情况下,约束不适用,因为所有表行都必须满足约束。使用触发器

约束不能包含子查询

或者使用唯一索引,这将强制唯一约束

create unique index index1 on table1 
     (case when ID <= XXX then null else ID end,
      case when ID <= XXX then null else name end);
在表1上创建唯一索引index1

(如果IDYes,则可以对许多列使用约束

但在这种情况下,约束不适用,因为所有表行都必须满足约束。请使用触发器

约束不能包含子查询

或者使用唯一索引,这将强制唯一约束

create unique index index1 on table1 
     (case when ID <= XXX then null else ID end,
      case when ID <= XXX then null else name end);
在表1上创建唯一索引index1

(在ID的情况下,我假设您希望防止名称和主_编号组合定义的重复记录

然后,方法是清理数据库,并创建唯一索引:

create unique index <index_name> on <table> (name, main_number)
在(名称、主编号)上创建唯一索引
这两个检查,并加快了速度

从理论上讲,如果你真的想保留旧的重复记录,你可以通过使用触发器来处理,但是你将很难从这些数据中获得意义

更新

如果使用触发器,一个表中会有两个数据分区,一个被检查,另一个未被检查。因此所有查询都必须注意它。您只是延迟了问题

因此,要么清理它(通过删除或合并),要么将旧数据移动到单独的表中


您可以使用SQL select…group by查找重复记录,这样您就可以一次删除/移动它们。

我假定您希望防止名称和主编号组合定义的重复记录

然后,方法是清理数据库,并创建唯一索引:

create unique index <index_name> on <table> (name, main_number)
在(名称、主编号)上创建唯一索引
这两个检查,并加快了速度

从理论上讲,如果你真的想保留旧的重复记录,你可以通过使用触发器来处理,但是你将很难从这些数据中获得意义

更新

如果使用触发器,一个表中会有两个数据分区,一个被检查,另一个未被检查。因此所有查询都必须注意它。您只是延迟了问题

因此,要么清理它(通过删除或合并),要么将旧数据移动到单独的表中


您可以使用SQL select…group by查找重复项,这样您就可以一次删除/移动它们。

因为您的数据库是Oracle,所以您也可以使用NOVALIDATE约束。意思是:“不管数据如何,从现在开始验证就行了”


因为您的数据库是Oracle,所以您也可以使用NOVALIDATE约束。意思是:“不管数据如何,从现在开始验证即可。”


我真正的表有大约2000个id,我有大约200个重复的列,如果我想清理它们,我必须花上几天的时间跟踪每个id,并检查是否必须删除或重命名它。为什么如果使用触发器对我来说会很难?是的,这被称为在别人的糟糕设计之后清理。需要重构。@moudiz我已经更新了我的表回答。把你的查询建立在一个不稳固的基础上不会有什么好笑的。@铍感谢更新。我现在正在考虑清理表的可能性。清理的问题是id引用了另一个表,所以我必须说每一个id或信息都将丢失。你也可以对所有记录这样做。实际上你是not丢失数据-数据已丢失:-)我真正的表有大约2000个id,我有大约200个重复的列,如果我想清理它们,我必须花上几天的时间跟踪每个id,并检查是否必须删除或重命名它。为什么如果使用触发器对我来说会很难?是的,这被称为在别人的糟糕设计之后清理。需要重构。@moudiz我已经更新了我的表回答。把你的查询建立在一个不稳固的基础上不会有什么好笑的。@铍感谢更新。我现在正在考虑清理表的可能性。清理的问题是id引用了另一个表,所以我必须说每一个id或信息都将丢失。你也可以对所有记录这样做。实际上你是not正在丢失数据-数据已经丢失:-)如果使用此索引,则无需清理,假设ID正在增加。如果使用此索引,则无需清理,假设ID正在增加