SQL PRIMARY KEY 主键约束

时间:2018-11-15 17:48:41  来源:igfitidea点击:

在本教程中,我们将解释主键约束PRIMARY KEY的概念,并向您展示如何为表创建主键约束。

主键约束PRIMARY KEY简介

主键约束声明一个列或多个列的组合,这些列的值惟一地标识表中的每一行。这个列或列的组合也称为表的主键。如果插入或更新会导致主键重复的行,SQL引擎将发出错误。换句话说,主键约束将帮助实现自动强制数据的完整性。

主键必须遵循以下几个规则:

  • 每个表只有一个主键。
  • 如果主键是列,则此列的值必须唯一且不能为空。如果主键由多个列组成,则这些列中的每个值组合都必须是唯一的。
  • 如果主键由一个列组成,则可以将其定义为列定义的一部分。如果主键由多个列组成,则必须在CREATE TABLE语句的末尾定义它。
  • 主键列的数据类型有限制,例如,它不能是BLOB、CLOB、ARRAY或nclb。

PRIMARY KEY 约束示例

只包含1列的主键约束示例

在这个例中,我们创建一个日志表来存储事务日志。logs表由两列组成:logid和message。logid是logs表的主键。我们在下面的CREATE TABLE语句中将主键约束定义作为列定义的一部分:

CREATE TABLE logs (
  logid int(11) NOT NULL AUTO_INCREMENT  PRIMARY KEY,
  message char(255) NOT NULL
)

logid列定义为:
NOT NULL:列中的值不能为NULL(空)。在某些数据库管理系统中,如果将列定义为主键,那么会隐式地自动为其分配NOT NULL属性。
AUTO_INCREMENT:每当向表中插入新行时,数据库引擎就为列生成一个序列。AUTO_INCREMENT是MySQL特有的属性。AUTO_INCREMENT属性可以在SQL server中定义为IDENTITY,在PostgreSQL中定义为SERIAL。

包含多列的主键约束示例

CREATE TABLE orderdetails (
  OrderID int(11) NOT NULL,
  ProductID int(11) NOT NULL,
  UnitPrice decimal(19,4) NOT NULL,
  Quantity smallint(6) NOT NULL,
  Discount float NOT NULL,
  PRIMARY KEY (OrderID,ProductID),
 )

在orderdetails表中,我们有一个主键,它由OrderID和ProductID两列组成。因此,必须在表级别定义主键约束。