插入时是否可以传递值?

时间:2018-05-09 16:51:23

标签: mysql sql

我有一个这样的触发器:

IF ( value > new.value ) THEN

    ...

END IF

将执行AFTER INSERT。我需要在插入时传递value(它是一个数字)因为它在触发器的条件中使用它。知道我怎么能通过它?

注意到,目前它被硬编码到像IF ( 5 > new.value ) THEN这样的触发器中。我试图做的就是在插入时动态传递5

1 个答案:

答案 0 :(得分:1)

不,没有将参数传递给TRIGGER的定义机制。

我唯一能想到的是用户定义的变量(但我真的不想去那里),或者用SELECT语句从表中检索值。

我们可以在会话中设置用户定义的变量:

SET @value_for_after_insert_trigger = 5 ;

然后执行INSERT

INSERT INTO mytable (...) VALUES (...)

当触发AFTER INSERT触发器时(对于每一行),触发器主体可以引用用户定义的变量。例如:

   DECLARE ln_value INTEGER;
   SET ln_value = @value_for_after_insert_trigger; 

然后我们可以做

   IF ( ln_value > NEW.value ) THEN 

请注意,我们无法保证会话中的其他语句不会修改我们的用户定义变量。例如,BEFORE INSERT触发器可能会执行以下语句:

  SET @value_for_after_insert_trigger = 42 ;

...覆盖以前存储的值。 AFTER INSERT触发器将读取当前分配的值,获取42,而不是我们之前指定的5。并且我们无法保证AFTER INSERT触发器不会执行某些修改该值的操作。

  SET @value_for_after_insert_trigger = @value_for_after_insert_trigger + 1;

影响后续行的触发器执行。

提倡将其作为设计。我会避免使用像这样的用户定义变量。

另一种方法是使用SELECT语句从表中查询值。