INSERT语句中的动态值选择

时间:2014-04-25 16:41:24

标签: mysql insert ifnull

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

1 个答案:

答案 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 PROCEDURECREATE FUNCTION

我在Create function through MySQLdb的答案中写了一个例子和一个解释。

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