標準語法
ALTER TABLE 表名
ADD CONSTRAINT PK_表名 -- 慣用 PK_ 前綴
PRIMARY KEY (欄位1, 欄位2, ...);
完整範例
-- 建表 (無主鍵)
CREATE TABLE StudentCourse (
StudentNo VARCHAR(20) NOT NULL,
CourseNo VARCHAR(20) NOT NULL,
Score DECIMAL(5,2)
);
-- 新增複合主鍵
ALTER TABLE StudentCourse
ADD CONSTRAINT PK_StudentCourse
PRIMARY KEY (StudentNo, CourseNo);
⚠️ 必須條件
- 所有參與主鍵的欄位 必須為 NOT NULL
- 組合值 唯一 (資料需先清洗)
- 單表 僅能有一個 PRIMARY KEY 約束 (可包含多欄)
相關操作
-- 查看主鍵
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_NAME = 'StudentCourse' AND CONSTRAINT_TYPE = 'PRIMARY KEY';
-- 刪除主鍵
ALTER TABLE StudentCourse DROP CONSTRAINT PK_StudentCourse;
-- 修改主鍵 (必須先刪後加)
ALTER TABLE StudentCourse DROP CONSTRAINT PK_StudentCourse;
ALTER TABLE StudentCourse ADD CONSTRAINT PK_StudentCourse PRIMARY KEY (StudentNo, CourseNo, Semester);
複合主鍵 vs 代理鍵 (Surrogate Key) 選型
| 場景 | 推薦 | 理由 |
| 純關聯表 (多對多中間表) | 複合主鍵 (FK1, FK2) | 自然唯一、無額外儲存、JOIN 直接用 |
| 需被其他表引用 (子表有孫表) | 代理鍵 IDENTITY/BIGINT | 單欄 FK 簡潔、避免級聯更新、效能佳 |
| 業務鍵穩定、短、不變 | 業務鍵作主鍵 | 語義清晰、省 JOIN |
| 業務鍵長、可變、組合超 3 欄 | 代理鍵 + UNIQUE 業務鍵 | 索引窄、維護易 |