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



表1
ID-name-main_number-随机1-随机2
1*-aaaa-blalablabla*-***-*
2
-vvvvv-bluebluuu*-***-*
3
-aaaaa-blalablabla*-***-*


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

CONSTRAINT检查名称
CHECK(name=(A_name((

以这种方式,constraint可以有多于1列吗

CONSTRAINT检查名称
CHECK(name=(A_name(,main_number=(A_number((

我能用这种方式写一个警察吗

CONSTRAINT检查名称
CHECK(name=(选择与列名值相同的列的情况(

所以我的问题是:是否有一种方法simelar来检查约束,以帮助我知道是否有重复的列,或者我必须使用触发器?

由于您的数据库是Oracle,因此您也可以使用NOVALIDATE约束。意思是:"不管数据如何,只要从现在开始验证"。

  create table tb1 
  (field1 number);
  insert into tb1 values (1);
  insert into tb1 values (1);
  insert into tb1 values (1);
  insert into tb1 values (2);
  insert into tb1 values (2);
  commit;
  -- There should be an non-unique index first
  create index idx_t1 on tb1 (field1);
  alter table tb1 add constraint pk_t1 primary key(field1) novalidate;
  -- If you try to insert another 1 or 2 you would get an error
  insert into tb1 values (1);

是的,您可以对许多列使用约束。

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

约束不能包含子查询。

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

create unique index index1 on table1 
     (case when ID <= XXX then null else ID end,
      case when ID <= XXX then null else name end);

将"XXX"替换为您当前的最大值(ID(。

我假设您希望防止由name和main_number组合定义的重复记录。

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

create unique index <index_name> on <table> (name, main_number)

这两个检查,并加快速度。

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

更新

如果使用触发器,那么在一个表中会有两个数据分区——一个被选中,另一个没有。所以你所有的查询都必须注意它。你只是拖延了你的问题。

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

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

相关内容

最新更新