sql >> Database >  >> RDS >> Mysql

Stel alleen een unieke beperking in als een veld null is

MySQL ondersteunt functioneel belangrijkste onderdelen sinds 8.0.13 .

  • Als uw versie voldoende recent is, kunt u uw index definiëren als:

    UNIQUE(`user_id`, `test_id`, (IFNULL(`completed_date`, -1)))
    

    (Demo op dbfiddle.uk )

    Merk op dat de bovenstaande index ook dubbele datums voor voltooide uitvoeringen zal voorkomen. Als die geldig zouden zijn, zou een licht gewijzigde index werken:

    UNIQUE(`user_id`, `test_id`, (
        CASE WHEN `completed_date` IS NOT NULL
        THEN NULL
        ELSE 0
    END))
    

    (Demo op dbfiddle.uk )

    Al begint het dan een beetje vies aan te voelen;)

  • Als je ten minste versie 5.7 . hebt je kunt een (virtuele) gegenereerde kolom gebruiken als tijdelijke oplossing:

    CREATE TABLE `executed_tests` (
        `id` INTEGER AUTO_INCREMENT NOT NULL,
        `user_id` INTEGER NOT NULL,
        `test_id` INTEGER NOT NULL,
        `start_date` DATE NOT NULL,
        `completed_date` DATE,
        `_helper` CHAR(11) AS (IFNULL(`completed_date`, -1)),
        PRIMARY KEY (`id`),
        UNIQUE(`user_id`, `test_id`, `_helper`)
    );
    

    (Demo op dbfiddle.uk )

  • Als je vastzit op 5.6 dan een combinatie van een gewone (niet-virtuele) kolom en een licht gewijzigde INSERT uitspraken zouden werken:

    CREATE TABLE `executed_tests` (
        `id` INTEGER AUTO_INCREMENT NOT NULL,
        `user_id` INTEGER NOT NULL,
        `test_id` INTEGER NOT NULL,
        `start_date` DATE NOT NULL,
        `completed_date` DATE,
        `is_open` BOOLEAN,
        PRIMARY KEY (`id`),
        UNIQUE(`user_id`, `test_id`, `is_open`)
    );
    

    In dit geval zou u is_open . instellen naar true voor onvolledige uitvoeringen en naar NULL na voltooiing, gebruikmakend van het feit dat twee NULL s worden als ongelijk behandeld.

    (Demo op dbfiddle.uk )




  1. MySQL - Combineren van INSERT, VALUES en SELECT?

  2. Query vergelijken van datums in SQL

  3. Externe MySQL-sleutel die meer dan één veld gebruikt om te verwijzen naar een primaire sleutel uit een andere tabel

  4. Hoe importeer ik een Oracle-database uit dmp-bestand en logbestand?