【问题标题】:How to get column's DEFAULT in trigger?如何在触发器中获取列的默认值?
【发布时间】:2019-11-15 11:36:19
【问题描述】:

我希望某个列的值在某些条件下被强制触发为 DEFAULT。 在下面的示例中,如果 b 为 NULL,则应使用定义的 DEFAULT(即“SYSTEM”)设置a

CREATE TABLE `t_default` (
      `n` VARCHAR(50) NOT NULL
    , `a` VARCHAR(50) NOT NULL DEFAULT 'SYSTEM'
    , `b` VARCHAR(50) NULL DEFAULT NULL
    -- To moderators: please do not edit my formatting :)
);

DELIMITER //

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

DELIMITER ;

不幸的是,这会在插入时给出错误消息“Unknown column 'a' in 'field list'”:

INSERT INTO t_default (n) VALUES ('1');

我找到了similar question,但是提供表名或 db + 表名也不起作用:

CREATE TRIGGER `TRG_t_default_BeforeInsert` 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

在这种情况下,消息略有不同:“Unknown table 't_default' in field list

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

那么,是否有可能在触发器中获得列 DEFAULT?我正在使用 MySQL 5.7。

谢谢。

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

【问题讨论】:

    标签: mysql triggers default


    【解决方案1】:

    你可以试试

    IF NEW.b IS NULL THEN
        SELECT COLUMN_DEFAULT INTO @def FROM information_schema.COLUMNS 
        WHERE table_schema = 'database_name' 
                           AND table_name = 't_default' 
                           AND column_name = 'a'; 
    SET NEW.a = @def; 
    END IF;
    

    【讨论】:

    • 谢谢。这适用于 DEFAULT 为字符串的示例。如果是表达式则不起作用(例如a DATETIME DEFAULT CURRENT_TIMESTAMP)。
    • @fifonik,您是否收到Datetime 的任何错误?还是没有获得价值?
    • "列 'a' 的日期时间值 'CURRENT_TIMESTAMP' 不正确..."
    • @fifonik 您可以将IF (NEW.b IS NULL) THEN SET NEW.a = CURRENT_TIMESTAMP; END IF; 用于日期列
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 2011-01-13
    • 2019-07-07
    • 2012-04-06
    • 2011-12-30
    相关资源
    最近更新 更多