在本教學中,您將學習如何使用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) ;
在本教學中,您已經學習了如何為新表創建主鍵或為現有表添加主鍵。