如何在触发器中获取列的默认值?

时间:2019-11-15 03:00:20

标签: mysql triggers default

在某些情况下,我希望一栏的值被强制默认为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 ;

不幸的是,这会在插入时显示错误消息“ '字段列表'中的未知列'a'”。

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

在这种情况下,消息略有不同:“ 字段列表中的未知表't_default'

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

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

谢谢。

P.S。当然,我知道我可以SET NEW.a = 'SYSTEM';

1 个答案:

答案 0 :(得分: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;