Mysql触发器用条件更新空字段

时间:2015-12-17 03:48:49

标签: mysql triggers

我有一个MySQL表,看起来像这样

t   id   lang   title
1   7   en_UK   my_title
1   7   kh_KH                           

我想写一个触发器,将title更新为my_title,同一id为7

结果

t   id   lang   title
1   7   en_UK   my_title
1   7   kh_KH   my_title

根据我的理解。

DELIMITER $$

CREATE TRIGGER upd_title BEFORE UPDATE ON `term`
FOR EACH ROW BEGIN
  IF (NEW.title IS NULL OR NEW.title= '') THEN
        SET NEW.title= ??? ;
  END IF;
END$$

DELIMITER ;

[UPDATE1] - >不起作用(触发器未创建)

 DELIMITER $$
DROP TRIGGER IF EXISTS `update_category_after_insert`
CREATE TRIGGER `update_category` AFTER INSERT ON `categories`
 FOR EACH ROW BEGIN

  DECLARE loc_title text;

   IF (NEW.libelle_categorie IS NULL OR NEW.libelle_categorie= '') THEN
      select libelle_categorie into loc_title from categories where NEW.num_noeud= num_noeud and langue = 'en_UK';

      SET NEW.libelle_categorie = loc_title;
   END IF;

END
DELIMITER ;

[UPDATE2]

DELIMITER $$
CREATE TRIGGER ``update_category_after_insert`` BEFORE INSERT ON `categories`
 FOR EACH ROW BEGIN

  DECLARE loc_title text;

   IF (NEW.libelle_categorie IS NULL OR NEW.libelle_categorie= '') THEN
      select libelle_categorie into loc_title from categories where NEW.num_noeud= num_noeud and langue = 'en_UK';

      SET NEW.libelle_categorie = loc_title;
   END IF;

END
DELIMITER ;

最后,我为我的案例找到了很好的解决方案

 UPDATE categories c INNER JOIN categories c2 ON (
     c.num_noeud = c2.num_noeud
) SET c.libelle_categorie = c2.`libelle_categorie`

2 个答案:

答案 0 :(得分:1)

你能澄清一下吗? 您是否尝试从' en_UK'中的标题列中提取值?插入一个具有相同ID且未输入标题列的新行时存在的行?

CREATE TRIGGER upd_title BEFORE UPDATE ON `term`
FOR EACH ROW BEGIN

  DECLARE loc_title VARCHAR(20);

   IF (NEW.title IS NULL OR NEW.title= '') THEN
      select title into loc_title from term where NEW.id = id and lang = 'en_UK';

      SET NEW.title= loc_title;
   END IF;

END

这应该可以解决问题。

这是我的触发器def:

CREATE DEFINER = CURRENT_USER TRIGGER `therinks`.`glreturndata_BEFORE_UPDATE` BEFORE UPDATE ON `glreturndata` FOR   EACH ROW
BEGIN

    DECLARE myVal  VARCHAR(20);

    if NEW.DESCRIPTION IS NULL  or new.description = '' THEN

        SELECT min(description) into myVal from glreturndata where category = NEW.category and new.idglreturndata <> idglreturndata;
        Set NEW.DESCRIPTION = myval;
    end if;
END

答案 1 :(得分:0)

似乎你无法在触发器中完成所有这些操作。根据{{​​3}}:

  

在存储的函数或触发器中,不允许通过调用函数或触发器的语句修改已经使用(用于读取或写入)的表。

根据documentation,您似乎应该:

  

创建一个存储过程,插入/更新目标表,然后在事务中更新所有其他行。

使用存储过程,您将手动提交更改(插入和更新)。我没有在MySQL中做到这一点,但this answer看起来是一个很好的例子。