向datetime列的date部分添加唯一约束

kpbwa7wx  于 2021-06-17  发布在  Mysql
关注(0)|答案(3)|浏览(443)

在mysql中,是否可以对数据的日期部分进行唯一约束 dateTime 列?
例如,如果我有 2018-10-01 10:05:06 ,不允许出现以下情况 2018-10-01 11:00:00 ,因为它有相同的日期。
目前,我的最佳解决方案是将中的datetime列分离为单独的date和time列,并对date列执行唯一的操作。

qc6wkl3g

qc6wkl3g1#

这太复杂了,mysql本机无法处理,因为mysql对约束的支持非常有限。
您必须创建:
执行检查的存储过程 BEFORE 的触发器 INSERT 以及 UPDATE ,调用程序
下面是过程的样子(假设表被命名为 my_table 保存datetime的列是 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 ;
bxpogfeg

bxpogfeg2#

您了解一种方法,即将日期和时间拆分为单独的列。这可能是最简单的方法。
触发器是另一种方法,但要保持它是相当痛苦的。
另一种可能是使用列前缀。缺点是需要将列存储为字符串:

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

e4eetjau3#

你只能作为一个工作伙伴

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

相关问题