首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设计一个表,其中它是自引用的和顺序不重要的

如何设计一个表,其中它是自引用的和顺序不重要的
EN

Stack Overflow用户
提问于 2017-03-22 13:31:41
回答 2查看 34关注 0票数 0

假设我有一个用户列表,我想记录他们之间的握手:

代码语言:javascript
复制
CREATE TABLE "user" (
    id SERIAL PRIMARY KEY,
    name VARCHAR(70)
);

CREATE TABLE hand_shaking (
    user1 INTEGER NOT NULL REFERENCES user,
    user2 INTEGER NOT NULL REFERENCES user
);

user表的数据如下:

代码语言:javascript
复制
1,Sarah
2,John
3,Alex

hand_shaking表可以有如下所示的数据:

代码语言:javascript
复制
1,2

也就是说莎拉和约翰握手了。

现在的问题是,我应该如何设计hand_shaking表,以便不允许重复?例如,如果1,2已经插入,2,1就会失败。

我正在使用postgresql,我试图在hand_shaking表上声明hand_shaking,但是在插入1,2之后仍然允许使用2,1

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-22 13:35:56

为两个不同的组合创建索引相同值的唯一索引:

代码语言:javascript
复制
create unique index only_one_handshake 
    on hand_shaking (least(user1,user2), greatest(user1,user2));
票数 1
EN

Stack Overflow用户

发布于 2017-03-22 15:50:14

您可以使用数组构建检查逻辑,例如:

代码语言:javascript
复制
t=# create table so27 (a text,b text, c text);
CREATE TABLE
t=# insert into so27 select 'a','b','c';
INSERT 0 1
t=# insert into so27 select 'a','b','d';
INSERT 0 1
t=# insert into so27 select 'c','a','b';
INSERT 0 1
t=# select *,'{b,c,a}'::text[] @> ('{}'::text[]||a||b||c)::text[] from so27;
 a | b | c | ?column?
---+---+---+----------
 a | b | c | t
 a | b | d | f
 c | a | b | t
(3 rows)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42953134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档