向oracle数据库表添加唯一键

向oracle数据库表添加唯一键,oracle,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), Sta

正在尝试实现友谊表

来解释我到现在为止做了什么

我的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);

创建表关系(
关系号(8),
来自用户名varchar2(30),
图瑟纳姆·瓦尔恰尔2(30),
状态ID号,
时间戳,
约束关系主键(关系id),
外键(FromUserName)引用用户(username),
外键(ToUserName)引用用户(用户名)
);
更改表关系
添加约束关系_unique unique(FromUserName,ToUserName);
这里有一张图片来解释这个问题

我的问题 看看最后两排。。用户kamlesh1向jitu1发送请求,jitu1再次向kamlesh1发送请求,当我kamlesh1接受请求时,当jitu接受请求时,kamlesh到jitu的状态ID更改为1类似的情况。 我想防止这种重复,即 一旦用户向你发送了请求,你就不能向他发送请求,只能接受或拒绝他的请求。 我就是想不出合适的问题名称…如果你也能帮忙的话


请帮忙

您应该点菜。说,加上

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

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

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

几个旁注:存储0或1的值不需要
数字
(38位精度)<代码>编号(1)就足够了。另外,对于
SentTime
,您可能不需要
TIMESTAMP
的粒度,-a
DATE
应该可以实现这一点,并且可能会使算术更容易一些(
DATE
算术以天表示,
TIMESTAMP
算术以间隔表示)。最后,在Oracle中对列名使用CamelCase不是一个好主意,因为Oracle对象名不区分大小写,除非用双引号括起来。如果要查看数据字典,您会看到如下列:
FROMUSERNAME
TOUSERNAME
。最好使用像
FROM_USERNAME
to_USERNAME
(或
USERNAME_FROM
USERNAME_to
)这样的列名。

谢谢,先生,你能解释一下这些函数的意思吗……这是索引吗?我是一个学习者。我会犯这些错误。。无法创建唯一索引;找到重复的密钥对,你必须先删除重复的密钥,然后才能创建索引
CREATE UNIQUE INDEX relation_unique ON relationship ( LEAST(FromUserName, ToUserName), GREATEST(FromUserName, ToUserName) );