向oracle数据库表添加唯一键
正在尝试实现友谊表 来解释我到现在为止做了什么 我的DDL向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
<!-- 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
的粒度,-aDATE
应该可以实现这一点,并且可能会使算术更容易一些(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) );