0

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


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

约束 check_name
CHECK (name = (A_name))

约束可以以这种方式拥有超过 1 列吗?

CONSTRAINT check_name
CHECK (name = (A_name) , main_number=(A_number))

我可以这样写一个约束吗?

CONSTRAINT check_name
CHECK (name = (select case where there a column has the same value of column name))

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

4

3 回答 3

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);
于 2013-05-28T15:45:32.113 回答
0

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

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

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

这既检查,又加快速度。

从理论上讲,如果您真的想保留旧的重复记录,您可以使用触发器来解决问题,但是您将很难从这些数据中找出意义。

更新

如果你使用触发器,你最终会在一个表中得到两个数据分区——一个被检查,另一个未被检查。所以你所有的查询都必须注意它。你只是拖延你的问题。

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

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

于 2013-05-28T11:57:59.877 回答
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)。

于 2013-05-28T11:56:09.747 回答