1

所以我的问题如下。我有一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'
}
4

1 回答 1

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同样适用。

我在通过 MySQLdb 创建函数的回答中写了一个示例和解释。

有关于触发器的教程,例如:

于 2014-04-25T16:53:03.090 回答