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 ;
3条答案
按热度按时间qc6wkl3g1#
这太复杂了,mysql本机无法处理,因为mysql对约束的支持非常有限。
您必须创建:
执行检查的存储过程
BEFORE
的触发器INSERT
以及UPDATE
,调用程序下面是过程的样子(假设表被命名为
my_table
保存datetime的列是my_datetime
) :触发器创建:
bxpogfeg2#
您了解一种方法,即将日期和时间拆分为单独的列。这可能是最简单的方法。
触发器是另一种方法,但要保持它是相当痛苦的。
另一种可能是使用列前缀。缺点是需要将列存储为字符串:
这种方法非常有用,mysql最终在8.0.13中使用表达式实现了索引。这允许:
哦,还有另一种方法使用生成的列:
e4eetjau3#
你只能作为一个工作伙伴