自动将0或空字符串转换为NULL

3

[在MySQL中]
有没有办法限制任何字段不能为0,并且如果我得到0值,将其转换为NULL。
例如,两个产品不能有相同的序列号,但产品可以完全没有序列号。
我现在正在使用这个:(对于几个字段)

CREATE TABLE products (
    sn DECIMAL(8,2),
    UNIQE (sn),
    ...........
) ENGINE=InnoDB;
CREATE TRIGGER prod_zero1 BEFORE UPDATE ON products FOR EACH ROW
    SET NEW.sn=NULLIF(NEW.sn,0);

有没有更短、更快的方法来做这件事?
另一个问题是,当我尝试在同一张表中使用这个方法来处理几个字段时,会提示以下信息:

CREATE TRIGGER prod_zero2 BEFORE UPDATE ON products FOR EACH ROW
    SET NEW.name=NULLIF(NEW.name,"");
ERROR 1235 (42000): This version of MySQL doesn't yet support 'multiple triggers with the same action time and event for one table'

谢谢


2
我建议这种数据验证/操作应该在您的应用程序的更高级别上,即处理输入并生成SQL代码的代码。 - Rob Cowie
请不要在一个帖子中提出多个问题,请将它们拆分为两个问题。 - Johan
1
关于你的第一个问题,触发器是正确的方法。 - Johan
1
同意,我认为触发器是你最好的选择。关于问题2;你只需要一个触发器来完成所有的检查。 - StevieG
2个回答

2
不要使用多个触发器,使用一个能够处理所有字段的触发器。
CREATE TRIGGER prod_zero2 BEFORE UPDATE ON products FOR EACH ROW
BEGIN
SET NEW.sn=NULLIF(NEW.sn,0);
SET NEW.name=NULLIF(NEW.name,"");
END;

谢谢,我做了这个: CREATE TRIGGER prod_zero BEFORE UPDATE ON products FOR EACH ROW SET NEW.price=NULLIF(NEW.price,0),NEW.name=NULLIF(NEW.name,""); 它甚至更短。 - Dani-Br

0

您可以在单个触发器中完成此操作。

下面是您示例中的两列合并为一个触发器。我只是做了更新触发器,因为这是您示例中的内容,但您可能还需要另一个触发器来完成插入相同的操作。

DELIMITER $$

DROP TRIGGER IF EXISTS tr_b_upd_products $$

CREATE TRIGGER tr_b_upd_products BEFORE UPDATE ON products FOR EACH ROW BEGIN
  IF (NEW.sn = 0)
  THEN
    SET NEW.sn=NULL;
  END IF;

  IF (NEW.name = '')
  THEN
    SET NEW.name=NULL;
  END IF;
END $$

DELIMITER ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接