如何在SQL中定义由两个字段组成的复合主键?

我正在使用PHP创建表和所有内容.我想用字段QuestionIDMemeberIDvote创建一个表名voting.复合主键由字段QuestionIDMemberID组成.

我该怎么做?

推荐答案

澄清一下:一个表最多只能有一个主键.主键由一个或多个列(来自该表)组成.如果主键由两列或多列组成,则称为composite primary key.其定义如下:

CREATE TABLE voting (
  QuestionID NUMERIC,
  MemberID NUMERIC,
  PRIMARY KEY (QuestionID, MemberID)
);

然后,该对(QuestionID、MemberID)对于表必须是唯一的,并且两个值都不能为NULL.如果您执行这样的查询:

SELECT * FROM voting WHERE QuestionID = 7

它将使用主键的索引.如果你这样做:

SELECT * FROM voting WHERE MemberID = 7

不会,因为使用复合索引需要使用"左"方向的所有键.如果索引位于字段(A、B、C)上,而您的条件位于B和C上,则该索引对该查询没有用处.因此,从(QuestionID,MemberID)和(MemberID,QuestionID)中 Select 最适合您使用表格的方式.

如有必要,在另一个上添加索引:

CREATE UNIQUE INDEX idx1 ON voting (MemberID, QuestionID);

Sql相关问答推荐

SQL查询组类值在同一行中,并连接和排序其他值

SQL Oracle条件分组依据

如何从JSON数组中 Select 多个值

如何为该查询编写正确分区依据

如何简化此PostgreSQL查询以计算平均值?

如何在多列上编写具有不同条件的查询?

列(值不为空)到其他有序列

如何为给定的股票数据集计算利润/亏损,确保先卖出先买入的股票

删除重复记录但保留最新的SQL查询

SQL中如何转置表格 UNPIVOT是唯一的 Select 吗?

在Snowflake中如何使用SQL对版本字符串进行排序?

函数调用作为插入值语句中的参数

如何将 CONCATENATED 值与临时表中的值匹配

如何在 DAX 中通过 Window 函数应用订单

如何根据某个值在where子句中添加某个条件

字符串从更改到表列和查询中的一行的转换错误

如何对 SQL 表中的连续时间戳进行分组?

如何计算每行出现的次数并显示在另一个表中?

根据开始/结束标记将 GROUP_ID 分配给行

在sql server中创建唯一标识符列