sql - 如何在 SQL 中定义复合主键?

标签 sql primary-key composite-primary-key

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

我想创建一个表名voting,其中包含字段QuestionIDMemberIDvote。复合主键由字段 QuestionIDMemberID 组成。

我应该怎么做?

最佳答案

仅供说明:一张表最多可以有一个主键。主键由一列或多列(来自该表)组成。如果主键由两列或多列组成,则称为复合主键。其定义如下:

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) 中选择最适合您使用表格方式的选项。

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

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

关于sql - 如何在 SQL 中定义复合主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1110349/

相关文章:

php - 如何在 mySQL 的 REGEXP 中添加 PHP 变量

mysql - 如何在 SQL 中不使用 Unique/Primary key 关键字的情况下将数据唯一地插入到表中?还有其他办法吗?

indexeddb - 如何创建一个indexeddb复合键

redis - Redis 中等效的复合主键

sql - T-SQL 唯一标识列作为复合主键的一部分

c# - SQL Server 特定类型支持 OrmLite

mysql - SQL : Alias in FROM subquery MySQL doesn't work

Mysql 和键上的特殊字符

Cassandra 数据建模和集群设计

mysql - 在MySQL中使用存储过程时遇到两个问题