Sql 如何在表中的两列上建立一个聚集索引

Sql 如何在表中的两列上建立一个聚集索引,sql,sql-server,database-indexes,Sql,Sql Server,Database Indexes,我有这张桌子 UserProgrammingLanguagesId UserId, Name, ProgrammingLanguageId, KnowledgeId. 我正在向ProgrammingLanguageId和KnowledgeId中插入FK-PK关系的值。但我不希望,例如,如果一个用户 ProgrammingLanguageId-1Java脚本和他的knowledgde是KnowledgeId-2 中间,在该表中后面有相同的值。我想在某些用户有1和2个值时进行调整,以防止重复,因为

我有这张桌子

UserProgrammingLanguagesId
UserId,
Name,
ProgrammingLanguageId,
KnowledgeId.
我正在向ProgrammingLanguageId和KnowledgeId中插入FK-PK关系的值。但我不希望,例如,如果一个用户 ProgrammingLanguageId-1Java脚本和他的knowledgde是KnowledgeId-2 中间,在该表中后面有相同的值。我想在某些用户有1和2个值时进行调整,以防止重复,因为一个用户可以使用一个知识id了解一种programmign语言,而不是使用两个和两个相反的知识id

这是上传的表格截图


这有两种方法,具体取决于数据库

一种是强制对两个值进行排序,然后有一个唯一的约束:

alter table userPLs add constraint chk_userPLS_ids
    check (ProgrammingLanguageId < KnowledgeId);

alter table userPLs add constraint unq_userPLS_ids
    unique (ProgrammingLanguageId, KnowledgeId);
并非所有数据库都支持最小和最大,但它们是大多数数据库中的常见函数。有些数据库不支持基于函数的索引,但通常有一些变通方法

在SQL Server中,需要使用计算列和大小写表达式:

alter table userPLs将列添加为 编程语言ID<知识ID时的情况 然后编程语言ID else KnowledgeId 结束持续

create unique index unq_userPLS_ids on
    userPLs ( least_pk, greatest_pk );
alter table userPLs将列添加为 ProgrammingLanguageId>KnowledgeId时的情况 然后编程语言ID else KnowledgeId 结束持续

create unique index unq_userPLS_ids on
    userPLs ( least_pk, greatest_pk );

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

以下是表:简而言之,您希望用户只能为每种编程语言指定一个知识级别吗?您需要对UserId、ProgrammingLanguageId进行唯一的约束。在这种情况下,KnowledgeId是不相关的,因为它是一个属性。我不明白为什么Doe,2,1是无效的,有人可以是多种语言的初学者,但如果是,只需对UserId,KnowledgeId创建一个唯一的约束。一名员工不应该有一种语言的基本和中级,我该怎么做?请更新您的问题以反映这一点。根据表结构,您的需求转换为每个用户可能只指定一种语言,这将转换为对UserId、ProgrammingLanguageId的唯一约束,就像我已经说过的感谢您的回复Gordon。我尝试在userPLS leastProgrammingLanguageId上创建唯一索引unq_userPLS_ID,在userPLS leastProgrammingLanguageId上创建唯一索引unq_userPLS_ID,KnowledgeId greatestProgrammingLanguageId,KnowledgeId附近语法不正确,但我删除了所有,方法内部除外。顺便说一句,我使用的是MS SQL
create unique index unq_userPLS_ids on
    userPLs ( least_pk, greatest_pk );