摘要:在本教程中,您將學習如何使用 SQL PRIMARY KEY 約束向表中新增主鍵。
SQL 主鍵約束簡介 #
主鍵是唯一標識表中每一行的一列或一組列。主鍵確保每一行都是唯一的。
一個表包含且僅包含一個主鍵。如果主鍵只包含一列,那麼該列被稱為主鍵列。
如果主鍵包含兩列或更多列,這些列都是主鍵列。這種主鍵也稱為複合鍵。
以下是主鍵的主要特徵:
- 唯一性:主鍵列中的每個值都必須是唯一的。
- 非空性:主鍵列不能包含
NULL。 - 不可變性:主鍵列中的值不應更改。
要建立主鍵,您可以使用 PRIMARY KEY 約束。
column1 datatype PRIMARY KEYCode language: SQL (Structured Query Language) (sql)例如,以下語句使用 CREATE TABLE 語句建立一個名為 projects 的新表,並將 project_id 列作為主鍵列:
CREATE TABLE projects (
project_id INT PRIMARY KEY,
project_name VARCHAR(255) NOT NULL,
start_date DATE NOT NULL,
end_date DATE NOT NULL
);Code language: SQL (Structured Query Language) (sql)在此示例中,我們在 project_id 列的定義中使用了 PRIMARY KEY 關鍵字。通常,PRIMARY KEY 約束也會隱式強制執行 NOT NULL 約束,但 SQLite 除外。
在此示例中,我們將 PRIMARY KEY 定義為列約束,因為我們在主鍵列的定義中聲明瞭它。
SQL 允許您將主鍵列定義為表約束,方法是在列列表之後指定它,如下所示:
CREATE TABLE IF NOT EXISTS projects (
project_id INT,
project_name VARCHAR(255) NOT NULL,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
PRIMARY KEY (project_id)
);Code language: SQL (Structured Query Language) (sql)這種語法更適合定義包含兩列或更多列的主鍵。
例如,以下語句建立一個名為 project_assignments 的表,用於儲存分配給員工的專案:
CREATE TABLE project_assignments (
project_id INT,
employee_id INT,
assigned_date DATE NOT NULL,
PRIMARY KEY (project_id, employee_id)
);Code language: SQL (Structured Query Language) (sql)主鍵約束名稱 #
在定義主鍵約束時,您可以使用 CONSTRAINT 子句為其分配一個名稱:
CONSTRAINT constraint_name
PRIMARY KEY(column1, column2, ...)Code language: SQL (Structured Query Language) (sql)如果您沒有為 PRIMARY KEY 約束提供名稱,資料庫系統將為其生成一個預設名稱。
這個預設名稱可能因資料庫系統而異。下表顯示了不同資料庫系統中主鍵約束的預設名稱:
| 資料庫系統 | 預設主鍵約束名稱 |
|---|---|
| SQL Server | PK_TableName_HexadecimalSequence |
| MySQL | PRIMARY |
| PostgreSQL | TableName_pkey |
| Oracle | SYS_Cn (其中 n 是一個數字) |
| SQLite | sqlite_autoindex_TableName_n |
以下示例建立一個名為 project_milestones 的表來儲存專案里程碑:
CREATE TABLE project_milestones (
milestone_id INT,
project_id INT NOT NULL,
milestone_name VARCHAR(255) NOT NULL,
CONSTRAINT project_milestones_pk PRIMARY KEY (milestone_id)
);Code language: SQL (Structured Query Language) (sql)在此示例中,我們明確將主鍵約束命名為 project_milestones_pk。
從表中刪除主鍵 #
要從表中刪除主鍵,您可以使用 ALTER TABLE 語句:
ALTER TABLE table_name
DROP CONSTRAINT primary_key_constraint;Code language: SQL (Structured Query Language) (sql)在此語法中:
- 首先,指定要從中刪除主鍵的表名。
- 其次,提供主鍵約束的名稱。
要查詢主鍵約束名稱,您可以使用資料庫系統中的特定命令進行搜尋。
例如,以下語句從 project_milestones 表中刪除主鍵:
ALTER TABLE project_milestones
DROP CONSTRAINT project_milestones_pk ;Code language: SQL (Structured Query Language) (sql)在此語句中,project_milestones_pk 是 project_milestones 表主鍵的約束名稱。
某些資料庫系統(如 MySQL)不需要主鍵約束名稱。刪除主鍵約束的語法如下:
ALTER TABLE table_name
DROP PRIMARY KEY;Code language: SQL (Structured Query Language) (sql)向現有表新增主鍵 #
SQL 允許您建立一個沒有主鍵的表。但是,這並不是一個好習慣。
要向現有表新增主鍵,您可以使用 ALTER TABLE 語句:
ALTER TABLE table_name
ADD CONSTRAINT constraint_name
PRIMARY KEY (column1, column2, ...);Code language: SQL (Structured Query Language) (sql)在此語法中:
- 首先,指定要新增主鍵的表名。
- 其次,(可選)提供一個約束名稱。
- 第三,在
PRIMARY KEY子句中列出一個或多個主鍵列。
例如,以下語句向 project_milestones 表新增一個主鍵約束:
ALTER TABLE project_milestones
ADD PRIMARY KEY (milestone_id);Code language: SQL (Structured Query Language) (sql)摘要 #
- 主鍵是唯一標識表中每一行的一列或一組列。
- 使用
PRIMARY KEY約束為表定義主鍵。 - 使用
ALTER TABLE .... ADD PRIMARY KEY語句向現有表新增主鍵。 - 使用
ALTER TABLE ... DROP CONSTRAINT語句從表中刪除主鍵。