摘要:在本教程中,您将学习如何使用MySQL 主键约束来为表创建主键。
MySQL主键简介
主键是唯一标识表中每一行的一列或一组列。主键遵循以下规则:
- 主键必须包含唯一值。如果主键由多列组成,则这些列中的值的组合必须是唯一的。
- 主键列不能有
NULL
值。任何向主键列插入或更新NULL
的尝试都会导致错误。请注意,MySQL 隐式向主键列添加NOT NULL
约束。 - 一张表只能有一个主键。

因为 MySQL 使用整数的速度更快,所以主键列的数据类型应该是整数,例如INT ,
BIGINT
。并且您应该确保主键的整数类型的值范围足以存储表可能具有的所有可能的行。
主键列通常具有AUTO_INCREMENT
属性,每当您向表中插入新行时,该属性都会自动生成顺序整数。
当您为表定义主键时,MySQL 会自动创建一个名为PRIMARY
的索引。
MySQL PRIMARY KEY
示例
PRIMARY KEY
约束允许您在创建或更改表时定义表的主键。
1)在CREATE TABLE
中定义PRIMARY KEY
约束
通常,您在CREATE TABLE
语句中定义表的主键。
如果主键只有一列,则可以使用PRIMARY KEY
约束作为列约束:
CREATE TABLE table_name(
primary_key_column datatype PRIMARY KEY,
...
);
Code language: SQL (Structured Query Language) (sql)
当主键有多于一列时,必须使用PRIMARY KEY
约束作为表约束。
CREATE TABLE table_name(
primary_key_column1 datatype,
primary_key_column2 datatype,
...,
PRIMARY KEY(column_list)
);
Code language: SQL (Structured Query Language) (sql)
在此语法中,您可以使用逗号 (,) 分隔column_list
中的列。
当主键只有一列时,可以使用PRIMARY KEY
表约束:
CREATE TABLE table_name (
primary_key_column datatype,
... ,
PRIMARY KEY(primary_key_column)
);
Code language: SQL (Structured Query Language) (sql)
以下示例创建一个名为users
的表,其主键是user_id
列:
CREATE TABLE users(
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(40),
password VARCHAR(255),
email VARCHAR(255)
);
Code language: SQL (Structured Query Language) (sql)
此语句创建具有PRIMARY KEY
约束作为表约束的roles
表:
CREATE TABLE roles(
role_id INT AUTO_INCREMENT,
role_name VARCHAR(50),
PRIMARY KEY(role_id)
);
Code language: SQL (Structured Query Language) (sql)
如果主键由多列组成,则必须在CREATE TABLE
语句的末尾指定它们。您将逗号分隔的主键列列表放在PRIMARY KEY
关键字后面的括号内。
以下示例创建user_roles
表,其主键由两列组成: user_id
和role_id
。它将PRIMARY KEY
约束定义为表约束:
CREATE TABLE user_roles(
user_id INT,
role_id INT,
PRIMARY KEY(user_id,role_id),
FOREIGN KEY(user_id)
REFERENCES users(user_id),
FOREIGN KEY(role_id)
REFERENCES roles(role_id)
);
Code language: SQL (Structured Query Language) (sql)
请注意,该语句还创建了两个外键约束。
2)使用ALTER TABLE
定义PRIMARY KEY
约束
如果某个表由于某种原因没有主键,可以使用ALTER TABLE
语句向表添加主键,如下所示:
ALTER TABLE table_name
ADD PRIMARY KEY(column_list);
Code language: SQL (Structured Query Language) (sql)
以下示例将id
列添加到主键。
首先,创建没有主键的pkdemos
表。
CREATE TABLE pkdemos(
id INT,
title VARCHAR(255) NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
其次,使用ALTER TABLE
语句向pkdemos
表添加主键:
ALTER TABLE pkdemos
ADD PRIMARY KEY(id);
Code language: SQL (Structured Query Language) (sql)
如果你给已经有数据的表添加主键。将包含在主键中的列中的数据必须是唯一的且不为 NULL。
PRIMARY KEY
与UNIQUE KEY
与KEY
KEY
是INDEX
的同义词。当您想要为不属于主键或唯一键的列或一组列创建索引时,可以使用KEY
。
UNIQUE
索引确保列中的值必须是唯一的。与PRIMARY
索引不同,MySQL 允许在UNIQUE
索引中使用NULL
值。另外,一个表可以有多个UNIQUE
索引。
假设users
表中用户的email
和username
必须是唯一的。要强制执行这些规则,您可以为email
和username
名列定义UNIQUE
索引,如下所示:
为username
名列添加UNIQUE
索引:
ALTER TABLE users
ADD UNIQUE INDEX username_unique (username ASC) ;
Code language: SQL (Structured Query Language) (sql)
为email
列添加UNIQUE
索引:
ALTER TABLE users
ADD UNIQUE INDEX email_unique (email ASC) ;
Code language: SQL (Structured Query Language) (sql)
在本教程中,您学习了如何为新表创建主键或向现有表添加主键。