2016-04-23 177 views
2

我创建了一个表中的MySQL这样的:在mySQL中设置timestamp列的默认值为2时间戳的总和?

CREATE TABLE IF NOT EXISTS `LibraryManager`.`Card` (
    `card_id` INT NOT NULL AUTO_INCREMENT, 
    `card_registerDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `card_expiredDate` TIMESTAMP, 
    PRIMARY KEY (`card_id`)) 
ENGINE = InnoDB; 

现在我想设置的card_expiredDate到​​30或默认值CURRENT_TIMESTAMP + 30(从注册之日起30天)。有没有办法做到这一点? 非常感谢您阅读本文。

+0

但为什么存储派生价值? – Strawberry

回答

1

使用create语句设置到期列的默认值是不可能的,而是使用触发器。为此,你将不得不稍微修改你的创建语句。只要改变期满列的数据类型,新的查询:

CREATE TABLE IF NOT EXISTS `LibraryManager`.`Card` (
`card_id` INT NOT NULL AUTO_INCREMENT, 
`card_registerDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
`card_expiredDate` DATETIME, 
PRIMARY KEY (`card_id`)) 
ENGINE = InnoDB; 

,然后激活一个触发

CREATE TRIGGER before_insert_library_card 
BEFORE INSERT ON `LibraryManager`.`Card` 
FOR EACH ROW 
SET new.card_expiredDate = adddate(CURRENT_TIMESTAMP,30); 

希望这会有所帮助。

P.S:触发器会减慢插入操作的速度(或者前后应用的任何操作)。我建议你使用php/python或任何你使用的后端程序设置这些值。

相关:

Can I use a function for a default value in MySql?

+1

非常感谢!这是一个非常明确的答案。 – vunguyenhung

1

创建一个AFTER INSERT触发器,它会为你做的工作:

DELIMITER $$ 
CREATE TRIGGER set_expiration_date 
AFTER INSERT ON `LibraryManager` FOR EACH ROW 
BEGIN 

    UPDATE LibraryManager 
    SET card_expiredDate = DATE_ADD(NEW.card_registerDate, INTERVAL 30 DAY) 
    WHERE card_id = NEW.card_id; 

END; 
$$ 
DELIMITER ; 

PS:我没有测试过,如果你得到任何错误,请让我知道。

+1

最好在插入之前使用BEFORE INSERT触发器并计算值,而不是执行第二个UPDATE查询。 – Andrew

相关问题