在本教程中,您将学习如何使用MySQL主键(Primary Key)约束来创建表的主键。
MySQL主键简介
MySQL主键(Primary Key)是唯一标识表中每行的列或一组列。当定义表的主键时,必须遵循以下规则:
- 主键必须包含唯一值。如果主键由多个列组成,则这些列中的值的组合必须是唯一的。
- 主键列不能包含
NULL
值。 这意味着必须使用NOT NULL
属性声明主键列。如果没有指定NOT NULL
,MySQL将强制为主键列为NOT NULL
。 - 一张表只有一个主键。
因为MySQL使用整数工作更快,所以主键列的数据类型应该是整数类型,例如:INT
,BIGINT
。可以选择一个较小的整数类型:TINYINT
,SMALLINT
等。但是,应该确保值的范围的主键的整数类型足以存储表可能所具有最大行数。
主键列通常具有自动生成键的唯一序列的AUTO_INCREMENT
属性。下一行的主键值大于前一个行的主键值。
MySQL为表中的主键创建一个名为PRIMARY
的PRIMARY
索引类型。
定义MySQL主键约束
MySQL允许通过在创建或修改表时定义主键约束来创建主键。
使用CREATE TABLE语句定义MySQL PRIMARY KEY约束
当使用CREATE TABLE语句创建表时,MySQL允许创建主键。要为表创建PRIMARY KEY
约束,请在主键列的定义中指定PRIMARY KEY
。
以下示例将为users
表的user_id
列上创建主键:
USE testdb;
CREATE TABLE users(
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(40),
password VARCHAR(255),
email VARCHAR(255)
);
还可以在CREATE TABLE
语句的末尾指定PRIMARY KEY
,如下所示:
USE testdb;
CREATE TABLE roles(
role_id INT AUTO_INCREMENT,
role_name VARCHAR(50),
PRIMARY KEY(role_id)
);
如果主键由多个列组成,则必须在CREATE TABLE
语句的末尾指定它们。在PRIMARY KEY
关键字之后,将逗号分隔的主键列的列表在括号内。
CREATE TABLE userroles(
user_id INT NOT NULL,
role_id INT NOT NULL,
PRIMARY KEY(user_id,role_id),
FOREIGN KEY(user_id) REFERENCES users(user_id),
FOREIGN KEY(role_id) REFERENCES roles(role_id)
);
除了创建由user_id
和role_id
列组成的主键之外,该语句还创建了两个外键约束。
使用ALTER TABLE语句定义MySQL PRIMARY KEY约束
如果表由于某些原因没有主键,可以使用ALTER TABLE语句将具有所有主键的列添加到主键中,如下语句:
ALTER TABLE table_name
ADD PRIMARY KEY(primary_key_column);
以下示例将id
列添加到主键。
首先,创建t1
表但不定义主键。
CREATE TABLE t1(
id int,
title varchar(255) NOT NULL
);
其次,将id
列作为t1
表的主键。
ALTER TABLE t1
ADD PRIMARY KEY(id);
PRIMARY KEY与UNIQUE 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) ;
在email
列上添加UNIQUE
索引。
ALTER TABLE users
ADD UNIQUE INDEX email_unique (email ASC) ;
在本教程中,您已经学习了如何为新表创建主键或为现有表添加主键。