Добавить уникальное ограничение для части даты столбца DateTime - PullRequest
0 голосов
/ 28 декабря 2018

В MySQL возможно ли сделать уникальное ограничение для части даты столбца dateTime?

Например, если бы у меня было 2018-10-01 10:05:06, следующее не будет разрешено 2018-10-01 11:00:00, потому чтоу него та же дата.

В настоящее время мое лучшее решение - разделить столбец dateTime на отдельный столбец даты и времени и выполнить уникальную операцию со столбцом даты.

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Это слишком сложно для собственной обработки MySQL, которая в любом случае имеет довольно ограниченную поддержку ограничений.

Вам необходимо создать:

  • хранимую процедуру, которая выполняетпроверка
  • BEFORE запускает для INSERT и UPDATE, которые вызывают процедуру

Вот как должна выглядеть процедура (при условии, что таблица названа my_table и что столбец, содержащий дату и время, равен my_datetime):

DELIMITER $$ 

CREATE PROCEDURE `check_new_datetime`(IN new_datetime DATETIME)
BEGIN
    IF new_datetime IS NOT NULL THEN
        IF (SELECT COUNT(*) FROM my_table WHERE DATE(new_datetime) = DATE(my_datetime)) > 0 THEN
            SIGNAL SQLSTATE '45000'
                SET MESSAGE_TEXT = 'check constraint check_new_datetime failed';
        END IF;
    END IF;
END$$

DELIMITER ;

Запуск создания:

-- before insert
DELIMITER $$
CREATE TRIGGER `my_table_before_insert` BEFORE INSERT ON `my_table`
FOR EACH ROW
BEGIN
    CALL check_new_datetime(new.my_datetime);
END$$   
DELIMITER ; 

-- before update
DELIMITER $$
CREATE TRIGGER `my_table_before_update` BEFORE UPDATE ON `my_table`
FOR EACH ROW
BEGIN
    CALL check_new_datetime(new.my_datetime);
END$$
DELIMITER ;
0 голосов
/ 28 декабря 2018

Вы понимаете один метод, который заключается в разделении даты и времени на отдельные столбцы.Вероятно, это самый простой метод.

Триггер - это другой метод, но его довольно сложно поддерживать.

Другой возможностью является использование префиксов столбцов.Недостатком является то, что столбец должен храниться в виде строки:

create table t (
    . . .,
    datetimecol char(19),  -- format "YYYY-MM-DD HH:MI:SS"
);

create unique index unq_t_datetimecol on t(datetimecol(10));

Этот подход настолько полезен, что MySQL наконец-то реализовал индексы, используя выражения в 8.0.13.Это позволяет:

create table t (
    . . .,
    datetimecol datetime, 
    . . .
);

create unique index unq_t_datetimecol on t(date(datetimecol));

О, есть и другой метод, использующий также сгенерированные столбцы:

create table t (
    . . .,
    datetimecol datetime, 
    . . .,
    datecol date generated always as (date(datetimecol)) stored,
    unique (datecol)
);
0 голосов
/ 28 декабря 2018

Вы не можете, но как обходной путь

CREATE TABLE tbl_x (
  ts DateTime,
  gents Date AS (CAST(tbl_x.ts AS DATE)),
  UNIQUE(gents)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...