Contents

SQL Server 與 MySQL 中唯一索引鍵對 NULL 值的處理差異

最近我在 SQL Server 中設定了 Unique Key,目的是為了防止因程式錯誤導致重複的資料被插入。然而,我沒有考慮到 null 值也會被視為重複的資料。在 SQL Server 中,唯一索引鍵預設會阻擋重複的 null 值,但在 MySQL 中,唯一索引鍵則不會阻擋重複的 null 值。

實測結果小記

SQL Server: 預設會阻擋重複的 NULL 值,但你可以通過在索引中加入 WHERE ... IS NOT NULL 的條件來改變這種行為。值得一提的是,我發現 MySQL 在設定索引時並不支援 WHERE 條件。

MySQL: 不會阻擋重複的 NULL 值,並且我沒有找到任何方法可以改變這種行為。

如果你不對 SQL Server 進行調整,它預設是不允許重複的 NULL 值的。但如果你手動調整,就可以讓它允許重複的 NULL 值。在這裡,我使用 EF Core 來進行調整,並且設定了 Unique Key Index。

EF Core 設定 Unique Key 的預設條件為 IS NOT NULL

EntityFramework Core 設定 Unique Key 預設有帶 WHERE 條件為 IS NOT NULL

1
[Index(nameof(IdNo), IsUnique = true)]

EF Core 產生的結果如下:
https://i.imgur.com/yFFDaUr.png

參考資料:c# - Does EF Core allow a unique column to contain multiple nulls? - Stack Overflow

看到這個我就放心,用 EF Core 程式就能控制 Unique Key Index,可預防這個問題。

如果你不對 MySQL 進行調整,它預設是允許重複的 NULL 值。