【问题标题】:Using Mysql Trigger BEFORE INSERT for Default Value在插入之前使用 Mysql 触发器作为默认值
【发布时间】:2021-05-14 16:23:31
【问题描述】:

我在 Mysql 表上创建了一个 BEFORE INSERT 触发器。我想为 mySQL 5.4 中的日期字段创建默认值行为。这意味着如果在插入时没有为该字段提供值,我想使用触发器中的值。

CREATE TRIGGER `be_table1` 
BEFORE INSERT ON `table1` FOR EACH ROW SET NEW.`date_joined` = NOW();

到目前为止,这有效。但是如果我现在像这样将数据插入到我的表中......

INSERT INTO table1 (date_joined, productname) VALUES ('2001-02-10', 'hello world');

...插入的不是“2001-02-10”,而是当前日期

据我了解 BEFORE INSERT 触发器,它预先填充字段并且应该被插入语句覆盖。我错了吗?

【问题讨论】:

  • MySQL 5.4 在这一点上是彻头彻尾的古老。如果您可以升级到 5.7 或 8.0,您将看到显着的性能优势。
  • 你能添加一个WHERE NEW.date_joined IS NULL 子句吗?
  • 谢谢。我在哪里可以添加此条款?如果我把它放在 Now() 后面会出现语法错误

标签: mysql triggers


【解决方案1】:

您可以修改要插入到before insert 触发器中的值,而不是预先填充它!

您可以使用coalesce() 函数覆盖NEW 值,前提是它是null

...
SET NEW.`date_joined` = COALESCE(NEW.`date_joined`, NOW());

【讨论】:

  • 在 MySQL 中这也称为IFNULL(),尽管COALESCE() 更符合 SQL 标准。
猜你喜欢
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 2019-07-30
  • 2012-12-11
  • 2015-02-14
相关资源
最近更新 更多