2016-04-23 12 views
2

私はこのようなMySQLでテーブルを作成しました:タイムスタンプ列のデフォルト値を、mySQLの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; 

今、私は​​30またはCURRENT_TIMESTAMP + 30(レジスタ日から30日)にcard_expiredDateのデフォルト値を設定したいです。それを行う方法はありますか? これを読んでいただきありがとうございます。

+0

しかし、なぜ得られた値を保存しますか? – Strawberry

答えて

1

create文を使用して有効期限カラムのデフォルト値を設定することはできません。その代わりに、triggerを使用してください。そのためには、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

2回目の 'UPDATE'クエリを実行する代わりに、挿入前に' BEFORE INSERT'トリガと値を計算する方が良いでしょう。 – Andrew

関連する問題