操作步驟 (表設計師)
- 物件總管:右鍵子表 (含外來鍵欄位的表) → 設計
- 點選外來鍵欄位 (如
ParentID)
- 右鍵 → 關聯 (Relationships)
- 「外來鍵關聯」對話框:點選 加入
- 右側屬性:資料表與資料行規格 → 點選右側省略號 (...)
- 「資料表與資料行」對話框:
- 主要索引鍵資料表:選擇父表 (被參考表)
- 下方格狀:左欄選父表 PK 欄位,右欄選子表 FK 欄位
- 點選 確定
- 回到「外來鍵關聯」:確認名稱、更新/刪除規則 → 確定
- 關閉設計師 → 儲存 (Ctrl+S)
T-SQL 等效指令
-- 基本語法
ALTER TABLE dbo.ChildTable
ADD CONSTRAINT FK_Child_Parent
FOREIGN KEY (ParentID) REFERENCES dbo.ParentTable (ID);
-- 級聯規則
ALTER TABLE dbo.ChildTable
ADD CONSTRAINT FK_Child_Parent
FOREIGN KEY (ParentID) REFERENCES dbo.ParentTable (ID)
ON UPDATE CASCADE -- 父表 PK 更新 → 子表同步更新
ON DELETE SET NULL; -- 父表刪除 → 子表 FK 設為 NULL
-- 規則選項:NO ACTION (預設/報錯), CASCADE, SET NULL, SET DEFAULT
外來鍵屬性詳解
| 屬性 | 說明 | 建議 |
| 名稱 | FK_ChildTable_ParentTable | 統一命名慣例 |
| 啟用檢查既有資料 | WITH CHECK / WITH NOCHECK | 新 FK 用 CHECK,遷移髒資料用 NOCHECK 後再清理 |
| 啟用複寫 | Not For Replication | 合併式複寫時不強制 |
| ON UPDATE | CASCADE / NO ACTION / SET NULL / SET DEFAULT | 極少用 CASCADE,謹慎評估 |
| ON DELETE | CASCADE / NO ACTION / SET NULL / SET DEFAULT | 視業務:CASCADE (明細同刪), SET NULL (保留明細) |
常見問題
- 資料型別不符:FK 與 PK 型別、長度、精度必須完全一致
- 既有資料違反:子表有父表不存在的值 → 建立失敗,需先清理或用 NOCHECK
- 缺少父表索引:父表參考欄位必須有 PK 或 UNIQUE 約束/索引
- 循環參考:Table A → Table B → Table A,需至少一邊可 NULL
效能建議
- FK 欄位必須建立索引 (SQL Server 不自動建立),否則刪除/更新父表時需掃描子表全表
- 大量刪除父表資料時,考慮暫時停用 FK 或分批處理