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