所以我的问题如下。我有一个timeStatus
列,在INSERT
语句,'待处理'或'从不'上有两个值之一,具体取决于列fromDate
是否为NULL。
我已经制作了这个准备好的声明,但它不起作用,但代表了我的意图。另一方面,我不确定这里是否存在约束,而不是在语句中指定约束。这样我就可以为插入或更新指定状态值,表格会知道该怎么做。但是我需要一些指导,说明采用什么方法以及去哪里学习它。
以下是声明:
INSERT INTO Bservices (
servStatus, timeStatus,
fromDetails, fromDate, fromTime)
VALUES(
'pending', IF(ISNULL(`fromDate`)) 'pending' ELSE 'never',
'a', '', '')
预期的行为如下:
ON INSERT
if(fromDate == '') {
timeStatus = 'pending'
} else {
timeStatus = 'never'
}
ON UPDATE
if(timeStatus == 'pending' && fromDate != '') {
timeStatus = 'updated'
}
答案 0 :(得分:1)
当您使用INSERT语句的VALUES子句中的表达式执行此操作时,这不起作用,因为在创建行之前计算表达式。因此,所有列都是自然的NULL。
要执行您想要的操作,您需要在INSERT和BEFORE UPDATE之前编写触发器。类似下面的内容,虽然我没有测试过,所以我会给你调试:
CREATE TRIGGER insBservices
BEFORE INSERT ON Bservices
FOR EACH ROW
SET NEW.timeStatus = IF(NEW.fromDate IS NULL, 'pending', 'never');
CREATE TRIGGER updBservices
BEFORE UPDATE ON Bservices
FOR EACH ROW
SET NEW.timeStatus = IF(NEW.fromDate IS NOT NULL AND OLD.timeStatus = 'pending',
'updated', NEW.timeStatus);
重新评论:
如果你想了解更多关于触发器的知识,那么MySQL手册实际上在这方面相当薄弱。它们向您展示了参考语法,但没有很多示例。有很多棘手的部分。
例如,了解何时在定义触发器时使用DELIMITER
,以解释触发器体内分号与CREATE TRIGGER
语句本身的终结符之间的歧义。这也适用于CREATE PROCEDURE
和CREATE FUNCTION
。
我在Create function through MySQLdb的答案中写了一个例子和一个解释。
有关于触发器的教程,例如: