向DateTime列的日期部分添加唯一约束

时间:2018-12-28 09:59:41

标签: mysql sql unique-constraint

在MySQL中是否可以对dateTime列的日期部分进行唯一约束?

例如,如果我有2018-10-01 10:05:06,则不允许使用以下内容2018-10-01 11:00:00,因为它具有相同的日期。

目前,我最好的解决方案是将dateTime列分为一个单独的日期和时间列,并对date列执行唯一的操作。

3 个答案:

答案 0 :(得分:1)

这太复杂了,无法由MySQL本机处理,反正对约束的支持非常有限。

您将必须创建:

  • 执行检查的存储过程
  • BEFORE的{​​{1}}和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 ;

答案 1 :(得分:0)

您只能解决,

CREATE TABLE tbl_x (
  ts DateTime,
  gents Date AS (CAST(tbl_x.ts AS DATE)),
  UNIQUE(gents)
);

答案 2 :(得分:0)

您了解一种方法,该方法是将日期和时间分为不同的列。那可能是最简单的方法。

触发器是另一种方法,但是维护起来很痛苦。

另一种可能性是使用列前缀。缺点是该列需要存储为字符串:

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