问题 插入值检查前的MySQL触发器


我有一张桌子 staff 同 office 柱。目前 office 列不接受NULL值。持久存在于此表上的应用程序有一个错误,这意味着,当工作人员尚未分配办公室时,它会尝试在表上插入NULL值。

我被要求使用触发器来拦截插入物 Staff 表和检查是否 office value为NULL并将其替换为value N/A

以下是我到目前为止的尝试,但确实如此 error 试图实施。关于如何解决这个问题的任何想法。

CREATE TRIGGER staffOfficeNullReplacerTrigger BEFORE INSERT ON Staff
  FOR EACH ROW BEGIN
    IF (NEW.office IS NULL)
     INSERT INTO Staff SET office="N/A";
    END IF
  END;

错误:

MySQL数据库错误:您的SQL语法有错误;检查   与您的MySQL服务器版本对应的手册   在'INSERT INTO Staff SET office =“N / A”附近使用的语法;结束'


2848
2017-10-11 09:21


起源

为什么不改变架构呢 NULL 允许值?这正是如此 NULL 应该用于,因为它使人们能够区分没有办公室和办公室,恰好有价值 N/A (而你建议的解决方案不会)。 - eggyal


答案:


首先,更改表以允许NULL:

ALTER TABLE Staff MODIFY office CHAR(40) DEFAULT "N/A";

(更改 CHAR(40) 任何合适的东西。)然后你可以用作你的触发器:

CREATE TRIGGER staffOfficeNullReplacerTrigger 
BEFORE INSERT 
ON Staff
  FOR EACH ROW BEGIN
    IF (NEW.office IS NULL) THEN
      SET NEW.office = "N/A";
    END IF

11
2017-10-11 10:29





不应该是这样的:

DELIMITER $$

CREATE TRIGGER staffOfficeNullReplacerTrigger BEFORE INSERT ON Staff
FOR EACH ROW BEGIN
   IF (NEW.office IS NULL) THEN
        INSERT INTO Staff(office) VALUES("N/A");
   END IF;
END$$

3
2017-10-11 09:26



太酷了,你抓住了两个问题:) - xception


CREATE TRIGGER staffOfficeNullReplacerTrigger BEFORE INSERT ON Staff
  FOR EACH ROW BEGIN
    IF (NEW.office IS NULL)
     INSERT INTO Staff SET office="N/A";
    END IF

; END IF后添加半结肠

  END;

2
2017-10-11 10:36