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

时间:2013-05-28 11:37:27

标签: oracle

  表1   ID - 名称 - main_number - random1 - random2
  1 * - aaaa -blalablabla * - * ** - *
  2
- vvvv -blublubluuu * - * ** - *
  3
- aaaa -blalablabla * - * ** - **
< / p>


ID,名称和主号码是主键
我的问题,我注意到coulmn名称和主号码有重复的值,我不想添加任何其他重复值(我应该保留旧的duplicat,因为在我的真实表中有很多重复的数据,很难删除它们)
当我尝试(在提交之前)知道我想要插入的这个名字是重复时,我想要的是什么。
我可以在一个程序或triger中做到这一点,但我听说约束检查更简单,更容易(如果有一个更简单的方法,那么程序或triger生病了很高兴学习它)

  

CONSTRAINT check_name
  检查(名称=(A_name))   

这个constaraint可以用这样的方式有超过1列吗?

  

CONSTRAINT check_name
  检查(名称=(A_name),main_number =(A_number))

我可以这样写一个constaraint吗?

  

CONSTRAINT check_name
  CHECK(name =(选择列中具有相同列名的情况))

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

3 个答案:

答案 0 :(得分:3)

由于您的数据库是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);

答案 1 :(得分:0)

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

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

约束不能包含子查询。

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

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)。

答案 2 :(得分:0)

我假设你想要防止由name和main_number的组合定义的重复记录。

然后要做的就是清理数据库,并创建一个唯一的索引:

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

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

理论上,如果你真的想要保留旧的重复记录,你可以使用触发器相处,但是那时你将很难从这些数据中理解。

更新

如果你使用了触发器,你最终会在一个表中得到两个数据分区 - 一个被检查,另一个不被检查。因此,您的所有查询都必须注意它。你只是推迟了你的问题。

因此要么清理它(通过删除或合并),要么将旧数据移到另一个表中。

您可以使用 SQL select ... group by 来查找重复项,以便您可以一次删除/移动它们。