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.

komentáře

RSS Komentáře k článku RSS Komentáře   Add to Google
16.02.2011 17:53 | Anonym (Jakub Vrána) | V MySQL se to dá vypnout

Pozor na to, že v InnoDB se kontrola unikátnosti dá pomocí unique_checks vypnout.

18.02.2011 17:47 | Administrátor | Re: V MySQL se to dá vypnout

bavíme se o kontrole na multi null? vypnutí unique_checks mi nic neříká, můžeš popsat co tím přesně myslíš? pokud je sloupec unique tak pevně doufám, že kontrola vypnout nejde? nebo k čemu je něco takového dobré?

18.02.2011 23:39 | Anonym (Jakub Vrána) | Re: Re: V MySQL se to dá vypnout

Ne, bavíme se o vypnutí kontroly jakýchkoliv unikátních klíčů. Může to být dobré k importu starých dat, u kterých mi nevadí, že jsou duplicitní, ale nová už chci mít správně. Ale osobně mi to přijde jako misfeature.

20.02.2011 15:15 | Administrátor | Re: Re: Re: V MySQL se to dá vypnout

zajímavé, tedy feature co umožňuje zablít si databázi nekonzistentními daty, doufám, že nebude nikdy potřeba

Jméno
Název
Text
Lze používat Texy! syntax. Příklad syntaxe: "text odkazu":odkaz, **tučně**, *kurzíva*, `code`. PHP kód uzavírejte do <?php ... ?> a JavaScript do <script> ... </script>