转载自:http://www.mysqltutorial.org/mysql-primary-key/
MySQL Primary Key
Summary: in this tutorial, you will learn how to use MySQL primary key constraint to create a primary key for the table.
Introduction to MySQL primary key
A primary key is a column or a set of columns that uniquely identifies each row in the table. You must follow the rules below when you define a primary key for a table:
- A primary key must contain unique values. If the primary key consists of multiple columns, the combination of values in these columns must be unique.
- A primary key column cannot contain
NULL
values. It means that you have to declare the primary key column with theNOT NULL
attribute. If you don’t, MySQL will force the primary key column asNOT NULL
implicitly. - A table has only one primary key.
Because MySQL works faster with integers, the data type of the primary key column should be the integer e.g., INT,
BIGINT.
You can choose a smaller integer type: TINYINT
, SMALLINT
, etc. However, you should make sure that the range of values of the integer type for the primary key is sufficient for storing all possible rows that the table may have.
A primary key column often has the AUTO_INCREMENT
attribute that generates a unique sequence for the key automatically. The primary key of the next row is greater than the previous one.
MySQL creates an index named PRIMARY
with PRIMARY
type for the primary key in a table.
Defining MySQL PRIMARY KEY Constraints
MySQL allows you to create a primary key by defining a primary key constraint when you create or modify the table.
Defining MySQL PRIMARY KEY constraints using CREATE TABLE statement
MySQL allows you to create the primary key when you create the table using the CREATE TABLEstatement. To create a PRIMARY KEY
constraint for the table, you specify the PRIMARY KEY
in the primary key column’s definition.
The following example creates users
table whose primary key is user_id
column:
1
2
3
4
5
6
|
CREATE TABLE users(
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(40),
password VARCHAR(255),
email VARCHAR(255)
);
|
You can also specify the PRIMARY KEY
at the end of the CREATE TABLE
statement as follows:
1
2
3
4
5
|
CREATE TABLE roles(
role_id INT AUTO_INCREMENT,
role_name VARCHAR(50),
PRIMARY KEY(role_id)
);
|
In case the primary key consists of multiple columns, you must specify them at the end of the CREATE TABLE
statement. You put a coma-separated list of primary key columns inside parentheses followed the PRIMARY KEY
keywords.
1
2
3
4
5
6
7
|
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)
);
|
Besides creating the primary key that consists of user_id
and role_id
columns, the statement also created two foreign key constraints.
Defining MySQL PRIMARY KEY constraints using ALTER TABLE statement
If a table, for some reasons, does not have a primary key, you can use the ALTER TABLE statement to add a column that has all necessary primary key’s characteristics to the primary key as the following statement:
1
2
|
ALTER TABLE table_name
ADD PRIMARY KEY(primary_key_column);
|
The following example adds the id column to the primary key.
First, create the t1
table without defining the primary key.
1
2
3
4
|
CREATE TABLE t1(
id int,
title varchar(255) NOT NULL
);
|
Second, make the id
column as the primary key of the t1
table.
1
2
|
ALTER TABLE t1
ADD PRIMARY KEY(id);
|
PRIMARY KEY vs. UNIQUE KEY vs. KEY
A KEY
is a synonym for INDEX
. You use the KEY
when you want to create an index for a column or a set of columns that is not the part of a primary key or unique key.
A UNIQUE
index creates a constraint for a column whose values must be unique. Unlike the PRIMARY
index, MySQL allows NULL
values in the UNIQUE
index. A table can also have multiple UNIQUE
indexes.
For example, the email
and username
of a user in the users
table must be unique. You can define UNIQUE
indexes for the email
and username
columns as the following statement:
Add a UNIQUE
index for the username
column.
1
2
|
ALTER TABLE users
ADD UNIQUE INDEX username_unique (username ASC) ;
|
Add a UNIQUE
index for the email
column.
1
2
|
ALTER TABLE users
ADD UNIQUE INDEX email_unique (email ASC) ;
|
In this tutorial, you have learned how to create a primary key for a new table or add a primary key for an existing table.