开发者社区 问答 正文

我希望在某些情况下触发某一列的值成为默认值。在下面的示例中,如果bIS为NULL,a则应使用定义的默

我希望在某些情况下触发某一列的值成为默认值。在下面的示例中,如果bIS为NULL,a则应使用定义的默认值(即“ SYSTEM”)进行设置。

CREATE TABLE t_default ( n VARCHAR(50) NOT NULL, a VARCHAR(50) NOT NULL DEFAULT 'SYSTEM', b VARCHAR(50) NULL DEFAULT NULL ) ;

DELIMITER //

CREATE TRIGGER TRG_t_default_before_insert BEFORE INSERT ON t_default FOR EACH ROW BEGIN IF NEW.b IS NULL THEN SET NEW.a = DEFAULT(a); END IF; END //

DELIMITER ; 不幸的是,这在插入时给出错误消息“ '字段列表'中的未知列'a' ”:

INSERT INTO t_default (n) VALUES ('1'); 我发现了类似的问题,但是提供表名或db +表名不能正常工作:

CREATE TRIGGER TRG_t_default_before_insert BEFORE INSERT ON t_default FOR EACH ROW BEGIN IF NEW.b IS NULL THEN SET NEW.a = DEFAULT(t_default.a); -- SET NEW.a = DEFAULT(test.t_default.a); END IF; END 在这种情况下,消息略有不同:“ 字段列表中的未知表't_default' ”

另外,我尝试对列名使用反引号,但没有成功。

因此,是否有可能在触发器中获取DEFAULT列?我正在使用MySQL 5.7。

谢谢。

PS当然,我知道我可以做到 SET NEW.a = 'SYSTEM';

展开
收起
保持可爱mmm 2019-11-15 11:15:39 330 分享 版权
阿里云 AI 助理回答

在MySQL 5.7中,直接使用DEFAULT(column_name)语法在触发器中设置默认值是不受支持的。你遇到的错误信息表明MySQL无法识别你在触发器上下文中对DEFAULT的这种用法。但是,你可以通过直接指定默认值来达到相同的目的。

既然你已经知道默认值是'SYSTEM',你可以直接在触发器中设置这个值,而不是尝试去引用默认值。所以你的触发器应该修改为如下:

DELIMITER //
CREATE TRIGGER TRG_t_default_before_insert BEFORE INSERT ON t_default FOR EACH ROW
BEGIN
   IF NEW.b IS NULL THEN
      SET NEW.a = 'SYSTEM';
   END IF;
END; //
DELIMITER ;

这样,当插入新记录且字段b为NULL时,触发器就会将字段a的值设置为你预定义的默认值'SYSTEM'。这种方法简单直接,也完全符合你的需求。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答