首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对表中的两列创建一个聚集索引

如何对表中的两列创建一个聚集索引
EN

Stack Overflow用户
提问于 2019-08-28 19:21:27
回答 1查看 110关注 0票数 0

我有一张桌子

代码语言:javascript
复制
UserProgrammingLanguagesId
UserId,
Name,
ProgrammingLanguageId,
KnowledgeId.

我插入到ProgrammingLanguageId和KnowledgeId的值是FK-PK relationship.But我不想要的,例如,如果一个用户有ProgrammingLanguageId - 1(Java Script),他的知识是KnowledgeId -2(中级),在该表中有相同的值。我想当一些用户有2个值的1时,以防止重复,因为一个用户可以用一个知识id知道一种编程语言,而不是两个或相反的。

这是上传的带有表格https://ibb.co/sPn5zT7的屏幕截图

代码语言:javascript
复制
//i am preventing this and it is working
insert into userPLs values(5,'9d313e61-8fb7-4011-88f0-6494621f43f7','Doe',1,1)

//How can i prevent this insert here?
insert into userPLs values(5,'9d313e61-8fb7-4011-88f0-6494621f43f7','Doe',1,2)
EN

回答 1

Stack Overflow用户

发布于 2019-08-28 19:32:30

有两种方法可以做到这一点,具体取决于数据库。

一种是在两个值上强制排序,然后有一个唯一的约束:

代码语言:javascript
复制
alter table userPLs add constraint chk_userPLS_ids
    check (ProgrammingLanguageId < KnowledgeId);

alter table userPLs add constraint unq_userPLS_ids
    unique (ProgrammingLanguageId, KnowledgeId);

这将只允许您插入(1,2),而不是(2,1),因此您无法获得重复项。

第二种方法是对唯一索引使用least()/greatest()或类似的逻辑:

代码语言:javascript
复制
create unique index unq_userPLS_ids on
    userPLs ( least(ProgrammingLanguageId, KnowledgeId),
             greatest(ProgrammingLanguageId, KnowledgeId),
           );

并非所有数据库都支持least()greatest(),但它们是大多数数据库中的常见函数。有些数据库不支持基于函数的索引,但通常有一种变通办法。

在SQL Server中,您需要使用计算列和case表达式:

alter table userPLs add column least_pkid as (case when ProgrammingLanguageId < KnowledgeId then ProgrammingLanguageId else KnowledgeId end)持久化;

alter table userPLs add column greatest_pkid as (case when ProgrammingLanguageId > KnowledgeId then ProgrammingLanguageId else KnowledgeId end)持久化;

代码语言:javascript
复制
create unique index unq_userPLS_ids on
    userPLs ( least_pk, greatest_pk );

我应该补充说,您也可以为此目的定义触发器,但这不是必需的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57691235

复制
相关文章

相似问题

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