将唯一键添加到oracle数据库表

时间:2015-03-28 17:57:43

标签: oracle

尝试实现友谊表..

解释我迄今为止所做的事情

我的DDL

<!-- WORKING -- "relationship" - This table used to store the relationship between users -->
create table relationship(
    relation_id number(8),
    FromUserName varchar2(30),
    ToUserName varchar2(30),
    StatusId number,
    SentTime timestamp,
    constraint relationship_pk primary key(relation_id),
    foreign key (FromUserName) references users(username),
    foreign key (ToUserName) references users(username)
);

<!--WORKING add the unique key to 'relationship' table so that a user can send request at time to user only oncle -->

ALTER TABLE relationship
ADD CONSTRAINT relation_unique UNIQUE (FromUserName, ToUserName);

这是一张解释问题的图片

enter image description here

我的问题  看看最后两行。 ..用户kamlesh1向jitu1发送请求,jitu1再次向kamlesh1发送请求,当我kamlesh1接受请求时,当jitu接受请求时,statusid更改为kamlesh到jitu的类似情况。 我想防止这种重复,即 一旦用户向您发送了请求,您就无法向他发送请求,只是接受他的请求或拒绝它。 我只是想不出正确的问题标题......如果你也可以提供帮助。

请帮忙

2 个答案:

答案 0 :(得分:1)

您可以为此创建一个独特的基于函数的索引:

CREATE UNIQUE INDEX relation_unique ON relationship ( LEAST(FromUserName, ToUserName), GREATEST(FromUserName, ToUserName) );

一些附注:您不需要NUMBER(精确度为38位)来存储0或1的值。NUMBER(1)应该足够了。此外,您可能不需要TIMESTAMP SentTime的粒度 - DATE应该可以做到这一点,并且可以使算术更容易一些(DATE算术表示为天,TIMESTAMP算术间隔)。最后,在Oracle中使用CamelCase作为列名称并不是一个好主意,因为Oracle对象名称不区分大小写,除非用双引号将它们括起来。如果您要检查数据字典,您会看到如下列:FROMUSERNAMETOUSERNAME。使用FROM_USERNAMETO_USERNAME(或USERNAME_FROMUSERNAME_TO)等列名称会更好。

答案 1 :(得分:0)

你应该订购这些人。说,添加

alter table relationship
  add constraint relation_order_chk
  check (fromusername < tousername);

然后,在插入时,执行类似

的操作
create or replace procedure AddRelationship(p_from varchar2, p_to varchar2 ...) is
begin
  insert into relationship (fromusername, tousername, ...)
    values(least(p_from, p_to), greatest(p_from, p_to), ...);
end;