【问题标题】:mysql trigger. How to right change value in inseriting row if it's null (default)mysql触发器。如果它为空,如何在插入行中正确更改值(默认)
【发布时间】:2017-06-11 16:40:35
【问题描述】:

我有表 lbs_records,包含字段:

taken TIMESTAMP NOT NULL DEFAULT current_timestamp(),
expected TIMESTAMP NULL DEFAULT NULL ,

我有触发器:

DELIMITER $$
DROP TRIGGER IF EXISTS trig_records_correct $$
CREATE TRIGGER trig_records_correct BEFORE INSERT ON lbs_records
  FOR EACH ROW BEGIN
  IF ( NEW.expected IS NULL ) THEN
    SET NEW.expected = adddate( NEW.taken, ( SELECT lbs_books.`4home_ondays`
      FROM lbs_books WHERE lbs_books.id = NEW.book_id ) );
  END IF;
  UPDATE lbs_books
  SET lbs_books.in_stock = lbs_books.in_stock -1
  WHERE lbs_books.id = NEW.book_id;
END $$
DELIMITER ;

当我尝试在此表中插入行时,我的触发器仅更改(减少)lbs_books.in_stock 中 id = NEW.book_id 的行的值。但它不会更改现在插入的行中的“预期”字段。插入行后,“预期”字段为空。

  1. 当触发器开始为查询 INSERT INTO lbs_records (user_id, book_id) VALUES (5,1); 工作时,我是否正确,它也与字段一起获得行 '采取':'当前日期时间','预期':'null'?
  2. 为什么在插入行之后,此行包含字段“预期”,即使在触发器的工作之后为空?

【问题讨论】:

  • 您能否提供一些来自 lbs_books 的样本数据(尤其是 4home_ondays 值)
  • @NigelRen,是的 screenshot

标签: mysql triggers


【解决方案1】:

在insert触发器前使用MySQL时,列的默认值是没有设置的,所以要么改变select重新添加默认...

SET NEW.expected = adddate( CURRENT_TIMESTAMP(), ( SELECT lbs_books.`4home_ondays`
      FROM lbs_books WHERE lbs_books.id = NEW.book_id ) );

或者事先获取值...

SET NEW.taken = DEFAULT(lbs_books.taken)

或者更长的路……

   SELECT COLUMN_DEFAULT INTO @def
   FROM information_schema.COLUMNS
   WHERE
     table_schema = 'database_name'
     AND table_name = 'lbs_books'
     AND column_name = 'taken';
   SET NEW.taken = @def;

【讨论】:

  • 如果查询已使用该字段的默认值开始,您的意思是“采取”字段不包含日期时间吗?那么这个字段包含什么值呢?空?
猜你喜欢
  • 2016-01-31
  • 2021-05-14
  • 2020-09-07
  • 1970-01-01
  • 2019-03-09
  • 2012-12-01
  • 1970-01-01
  • 2013-01-21
  • 2011-08-14
相关资源
最近更新 更多