在MySQL中是否可以对dateTime
列的日期部分进行唯一约束?
例如,如果我有2018-10-01 10:05:06
,则不允许使用以下内容2018-10-01 11:00:00
,因为它具有相同的日期。
目前,我最好的解决方案是将dateTime列分为一个单独的日期和时间列,并对date列执行唯一的操作。
答案 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)
);