Mysql
 sql >> база данни >  >> RDS >> Mysql

Задайте уникално ограничение само когато дадено поле е нула

MySQL поддържа функционални ключови части от 8.0.13 .

  • Ако вашата версия е достатъчно нова, можете да дефинирате своя индекс като:

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

    (Демо на dbfiddle.uk )

    Имайте предвид, че горният индекс също ще предотврати дублиране на дати за завършени екзекуции. Ако те трябва да са валидни, тогава леко модифициран индекс ще работи:

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

    (Демо на dbfiddle.uk )

    Въпреки че след това започва да се чувства малко мръсен;)

  • Ако имате поне версия 5.7 можете да използвате (виртуална) генерирана колона като заобиколно решение:

    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`)
    );
    

    (Демо на dbfiddle.uk )

  • Ако сте заседнали на 5.6 след това комбинация от обикновена (невиртуална) колона и леко модифициран INSERT изразите биха работили:

    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`)
    );
    

    В този случай бихте задали is_open на true за непълни изпълнения и към NULL след завършване, използвайки факта, че две NULL s се третират като неравни.

    (Демо на dbfiddle.uk )




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създаване на масив с помощта на рекурсивен php от mysql

  2. SQL заявка за избор на публикации, принадлежащи към множество категории

  3. Командата за актуализиране на MySQL не работи

  4. mysql актуализира множество редове, всеки със свои собствени стойности, с оператор CASE

  5. Настройка за съхранение на конфигурация [файл срещу база данни]