MySQL Primary Key約束

2019-10-16 22:57:21

在本教學中,您將學習如何使用MySQL主鍵(Primary Key)約束來建立表的主鍵。

MySQL主鍵簡介

MySQL主鍵(Primary Key)是唯一標識表中每行的列或一組列。當定義表的主鍵時,必須遵循以下規則:

  • 主鍵必須包含唯一值。如果主鍵由多個列組成,則這些列中的值的組合必須是唯一的。
  • 主鍵列不能包含NULL值。 這意味著必須使用NOT NULL屬性宣告主鍵列。如果沒有指定NOT NULL,MySQL將強制為主鍵列為NOT NULL
  • 一張表只有一個主鍵。

因為MySQL使用整數工作更快,所以主鍵列的資料型別應該是整數型別,例如:INTBIGINT。可以選擇一個較小的整數型別:TINYINTSMALLINT等。但是,應該確保值的範圍的主鍵的整數型別足以儲存表可能所具有最大行數。

主鍵列通常具有自動生成鍵的唯一序列的AUTO_INCREMENT屬性。下一行的主鍵值大於前一個行的主鍵值。

MySQL為表中的主鍵建立一個名為PRIMARYPRIMARY索引型別。

定義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_idrole_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對比

KEYINDEX的同義詞。當要為列建立索引,但不是主鍵或唯一鍵時使用KEY

UNIQUE索引為其值必須是唯一的列建立約束。與PRIMARY索引不同,MySQL在UNIQUE索引中允許有NULL值。 一個表也可以有多個UNIQUE索引。

例如,users表中的使用者的emailusername必須是唯一的。可以為emailusername列定義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) ;

在本教學中,您已經學習了如何為新表建立主鍵或為現有表新增主鍵。