MSSQL unique column with multiple NULL, SQL SERVER 2005

Přesto, že standardy ANSI SQL: 92, SQL: 1999 a SQL: 2003 říkají, že UNIQUE sloupec nesmí dovolit více duplicitních hodnot, ale může dovolit více NULL hodnot, MSSQL si to opět vykládá po svém.


MySQL není třeba popisovat, funguje to jak má. Jakákoli hodnota nesmí být duplicitní v rámci daného sloupce nebo dokonce v rámci několika složených sloupců. NULL (prázdné hodnoty) mohou být v libovolném množství použity v daném sloupci a přesto je dodržena unikátnost.

Určitě jste se s touto potřebou setkali, např. zákazníci v eshopu a údaj IČO. Byť to není příliš moudrý požadavek, tak řada eshopů implementuje unikátní zákaznické IČO, v praxi to znamená, že objednávku neuděláte pokud si nepamatujete své přihlašovací údaje a duplicitní registraci prostě nevytvoříte, naivně tak spoléháme na zákazníkovu trpělivost a jeho schopnosti vůbec pochopit co se po něm chce. Nicméně co koncový zákazník? Zákazník, který IČO nemá?

A jsme u toho jak to udělat, jako nejmenší zlo mi přijde toto řešení:

  1. CREATE TABLE [dbo].[UNIQUENESS](
  2. [id] [int] IDENTITY(1,1) NOT NULL,
  3. [testing] [nvarchar](50) NULL,
  4. [testing_unique] AS (case when [testing] IS NULL then [id] end
  5. ),
  6. CONSTRAINT [PK_UNIQUENESS] PRIMARY KEY CLUSTERED
  7. (
  8. [id] ASC
  9. )
  10. GO
  11. CREATE UNIQUE NONCLUSTERED INDEX [IX_UNIQUENESS] ON [dbo].[UNIQUENESS]
  12. (
  13. [testing] ASC,
  14. [testing_unique] ASC
  15. )

Řešení spočívá v přidání jednoho falešného sloupce, který je vypočítáván a NULL hodnoty nahrazuje hodnotou v PRIMARY KEY. Dohromady pak tvoří unikátní dvojici i pro NULL hodnoty v původním sloupci.

Tento workaround byl prezentován na stránkách connect.microsoft.com/SQLServer/feedback/details/299229/change-unique-constraint-to-allow-multiple-null-values Alenem Singfieldem.