Skip to main content

MySQL主键

MySQL主键简介

主键是唯一标识表中每一行的一列或一组列。主键遵循以下规则:

因为MySQL处理整数的速度更快,所以主键列的数据类型应该是整数,例如INT、BIGINT。并且您应该确保主键的整数类型的值范围足以存储表中所有可能的行。

主键列通常具有AUTO_INCREMENT属性,每当向表中插入新行时,该属性会自动生成一个连续整数。

当为表定义主键时,MySQL会自动创建一个名为primary的索引。

MySQL主键示例

主键约束允许您在创建或更改表时定义表的主键。

1) 在创建表中定义主键约束

通常,在CREATE table语句中定义表的主键。

如果主键有一列,则可以将主键约束用作列约束:

CREATE TABLE table_name(
primary_key_column datatype PRIMARY KEY,
...
);

当主键有多个列时,必须将主键约束用作表约束。

CREATE TABLE table_name(
primary_key_column1 datatype,
primary_key_column2 datatype,
...,
PRIMARY KEY(column_list)
);

在这种语法中,可以用逗号(,)分隔列列表中的列。

当主键有一列时,可以使用主键表约束:

CREATE TABLE table_name ( 
primary_key_column datatype,
... ,
PRIMARY KEY(primary_key_column)
);

以下示例创建一个名为users的表,其主键是user_id列:

CREATE TABLE users(
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(40),
password VARCHAR(255),
email VARCHAR(255)
);

此语句将创建具有主键约束作为表约束的角色表:

CREATE TABLE roles(
role_id INT AUTO_INCREMENT,
role_name VARCHAR(50),
PRIMARY KEY(role_id)
);

如果主键由多列组成,则必须在CREATE TABLE语句末尾指定它们。在主键关键字后面的括号内放置一个以逗号分隔的主键列列表。

下面的示例创建了user_roles表,其主键由两列组成:user_id和role_id。它将主键约束定义为表约束:

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)
);

请注意,该语句还创建了两个外键约束。

2) 使用ALTER TABLE定义主键约束

如果某个表由于某些原因没有主键,则可以使用ALTER TABLESTATE语句向该表添加主键,如下所示:

ALTER TABLE table_name
ADD PRIMARY KEY(column_list);

以下示例将id列添加到主键。

首先,创建不带主键的pkdemos表。

CREATE TABLE pkdemos(
id INT,
title VARCHAR(255) NOT NULL
);

其次,使用ALTER table语句向pkdemos表添加主键:

ALTER TABLE pkdemos
ADD PRIMARY KEY(id);

如果向已经有数据的表中添加主键。列中包含在主键中的数据必须唯一且不为空。

主键vs.唯一键vs.密钥

KEY是INDEX的同义词。如果要为不属于主键或唯一键的一列或一组列创建索引,可以使用该键。

唯一索引确保列中的值必须是唯一的。与主索引不同,MySQL允许在唯一索引中使用空值。此外,一个表可以有多个唯一的索引。

假设users表中用户的电子邮件和用户名必须是唯一的。要实施这些规则,您可以为电子邮件和用户名列定义唯一索引,如下所示:

为用户名列添加唯一索引:

ALTER TABLE users
ADD UNIQUE INDEX username_unique (username ASC) ;

为电子邮件列添加唯一索引:

ALTER TABLE users
ADD UNIQUE INDEX  email_unique (email ASC) ;

在本教程中,您学习了如何为新表创建主键或向现有表添加主键。