尝试在mySQL 5.6中编写一个触发器,在UPDATE之后写入另一个表

时间:2017-11-02 21:36:53

标签: mysql triggers

我在mySQL 5.6中编写了一个触发器,在更新了表A中的某些字段后,我会将表A的更改写入注释表,但是我在线上收到错误2,我很确定这是愚蠢的事情:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let header = BoatHeaderView()
    header.customInit(title: thisRaceName, section: 1, delegate: self)
    return header
}

我正在使用Sequel Pro的触发器UI,因此我的示例中没有正常的分隔符。

错误讯息:

  

MySQL说:你的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以获得正确的语法   使用在' SET \ @message =' UPDATED&#39 ;; IF(NEW.customerEmail!=   OLD.customerEmail)那么设置'在第2行

3 个答案:

答案 0 :(得分:1)

使用撇号代替“更新”

周围的引号

答案 1 :(得分:1)

因为触发器是多个语句,所以我需要用BEGIN END包装它。我没有意识到Sequel Pro没有自动包装通过UI创建的触发器。

BEGIN

    SET @createNote = 0;
    SET @message = 'UPDATED';

    IF (NEW.customerEmail != OLD.customerEmail) THEN
        SET @message = CONCAT(@message, '\r\n', OLD.customerEmail, ' -> ', NEW.customerEmail);
        SET @createNote = 1;
    END IF;

    IF (@createNote) THEN
        INSERT INTO claim_notes SET claimId = NEW.id, message = @message, createdBy = NEW.lastModifiedBy, type = 'system', createdByEmail = NEW.lastModifiedByEmail;
    END IF;

END;

我将根据@ BillKarwin的答案修改我的变量声明。

答案 2 :(得分:0)

在我将智能引号改为单引号之后,我的声明已经开始工作了。

CREATE TRIGGER TestTrigger AFTER UPDATE ON MyTable FOR EACH ROW
BEGIN
  SET @createNote = 0;
  SET @message = "UPDATED";
  IF (NEW.customerEmail != OLD.customerEmail) THEN
    SET @message := CONCAT(@message, '\r\n', OLD.customerEmail, ' -> ', NEW.customerEmail);
    SET @createNote := 1;
  END IF;
  IF (@createNote) THEN
    INSERT INTO claim_notes SET claimId = NEW.id, message = @message, createdBy = NEW.lastModifiedBy, type = 'system', createdByEmail = NEW.lastModifiedByEmail;
  END IF;
END

请注意这些是智能引号:‘’它们对我所知的任何编码语言都没用。

这些是单引号:''它们用于SQL中的字符串文字和日期文字。

其他一些建议:

  • 对所有字符串使用直接单引号。
  • 使用局部变量而不是会话变量。
  • 除非您在表达式中执行此操作,否则不需要:=进行分配。只需使用=获取常规SET语句。

所以我会这样写这个触发器:

CREATE TRIGGER TestTrigger AFTER UPDATE ON MyTable FOR EACH ROW
BEGIN
  DECLARE _createNote INT DEFAULT 0;
  DECLARE _message VARCHAR(255) DEFAULT 'UPDATED';
  IF (NEW.customerEmail != OLD.customerEmail) THEN
    SET _message = CONCAT(message, '\r\n', OLD.customerEmail, ' -> ', NEW.customerEmail);
    SET _createNote = 1;
  END IF;
  IF (_createNote) THEN
    INSERT INTO claim_notes SET claimId = NEW.id, message = _message, createdBy = NEW.lastModifiedBy, type = 'system', createdByEmail = NEW.lastModifiedByEmail;
  END IF;
END