我在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行
答案 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