尝试实现友谊表..
解释我迄今为止所做的事情
我的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);
这是一张解释问题的图片
我的问题 看看最后两行。 ..用户kamlesh1向jitu1发送请求,jitu1再次向kamlesh1发送请求,当我kamlesh1接受请求时,当jitu接受请求时,statusid更改为kamlesh到jitu的类似情况。 我想防止这种重复,即 一旦用户向您发送了请求,您就无法向他发送请求,只是接受他的请求或拒绝它。 我只是想不出正确的问题标题......如果你也可以提供帮助。
请帮忙
答案 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对象名称不区分大小写,除非用双引号将它们括起来。如果您要检查数据字典,您会看到如下列:FROMUSERNAME
,TOUSERNAME
。使用FROM_USERNAME
和TO_USERNAME
(或USERNAME_FROM
和USERNAME_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;