在C#數據庫開發中,正確理解並應用主鍵與唯一約束是保證數據完整性的關鍵。雖然兩者都能確保列值唯一,但它們在底層機制、業務語義及使用限制上存在本質差異。
| 特性 | 主鍵 | 唯一約束 |
|---|---|---|
| 表中數量 | 僅允許一個 | 可創建多個 |
| 空值允許 | 不允許NULL | 允許一個NULL(SQL Server) |
| 外鍵引用 | 可被外鍵引用 | 不可被外鍵引用 |
| 更新頻率 | 極少更新,通常不可變 | 可根據業務需求更新 |
| 索引類型 | 默認創建聚集索引 | 默認創建非聚集索引 |
| 業務含義 | 標識實體唯一標識 | 業務層面的唯一性限制 |
// Entity Framework Core 配置示例
protected override void OnModelCreating(ModelBuilder modelBuilder) {
// 主鍵配置
modelBuilder.Entity<User>()
.HasKey(u => u.Id);
// 唯一約束:用戶郵箱唯一
modelBuilder.Entity<User>()
.HasIndex(u => u.Email)
.IsUnique();
// 組合唯一約束:同一用戶同一課程只能選一次
modelBuilder.Entity<Enrollment>()
.HasIndex(e => new { e.UserId, e.CourseId })
.IsUnique();
}
❌ 認為「唯一約束就是備用主鍵」——外鍵無法引用唯一約束列。
❌ 在主鍵列上額外添加唯一索引——主鍵本身已隱含唯一性。
❌ 忽略NULL值在唯一約束中的特殊行為——不同數據庫對多NULL處理不同。
主鍵是實體標識的基石,唯一約束是業務規則的守門員。合理組合使用二者,能構建出既符合範式又高性能的數據庫模型。