MySQLは現在のタイムスタンプのフィールドを更新するために、複数のソリューションを作成するために、DEFAULTまたはUPDATE句ON CURRENT_TIMESTAMPを一つだけTIMESTAMP列が存在することができます

問題を再現するために、

この記事を書く前に、MySQLの、MariaDBの私のバージョンをクリアするか、MySQLの8を使用する場合、問題があるでしょう

MySQLのバージョン

さて、このような需要がある、テーブルには、このレコードを記録フィールドのcreated_atの作成タイムスタンプ、およびタイムスタンプの更新を記録したレコードupdated_atの別のフィールドがあります。
私たちは、次の文を作成してみてください。

表TEMP CREATE 
    ID INTを(11 )PRIMARY KEY AUTO_INCREMENT、
    名前VARCHAR(10 
    のcreated_atタイムスタンプNULLデフォルトCURRENT_TIMESTAMP、
    UPDATE CURRENT_TIMESTAMP ONタイムスタンプNULLデフォルトCURRENT_TIMESTAMP updated_atの
)。

 

エラーを実行した後:

报ERROR 1293(HY000)错误(完整错误信息:ERROR 1293(HY000):不適切なテーブル定義。)DEFAULTまたはONのUPDATE句にCURRENT_TIMESTAMPを持つ唯一のTIMESTAMP列が存在することができます

ソリューション

まず、デフォルトのCURRENT_TIMESTAMPまたはDEFAULTを使用してのcreated_at()、およびトリガーを使用updated_atの。

表TEMP CREATE 
    ID INTを(11 )PRIMARY KEY AUTO_INCREMENT、
    名前VARCHAR(10 
    のcreated_atタイムスタンプNULLデフォルトCURRENT_TIMESTAMP、
    タイムスタンプNULL updated_atの
)。

 

レコード更新時の更新を実現し、一時にトリガを作成

区切り文字| 
DROP TRIGGER IFはtri_temp_updated_atをEXISTS。
一時ON更新前トリガtri_temp_updated_atをCREATE 
EACH行については、
BEGIN 
    SET NEW.updated_at = NOW()を。
終わり; 
| 
区切り文字;

 

ソリューション2

第二に、(今UPDATE ON)(現在UPDATE CURRENT_TIMESTAMPまたはDEFAULTのデフォルトのCURRENT_TIMESTAMPを使用updated_atの、トリガーを使用してのcreated_at)。

表TEMPをCREATE 
    IDのINT(11 )PRIMARY KEY AUTO_INCREMENT、
    名前VARCHAR(10 
    のcreated_atタイムスタンプNULL、
    UPDATE CURRENT_TIMESTAMP ONタイムスタンプNULLデフォルトCURRENT_TIMESTAMP updated_atの
)。

 

一時にトリガーを作成し、レコードの挿入データの作成時間を達成

区切り文字| 
DROP TRIGGER IFはtri_temp_created_atをEXISTS。
INSERT ONの一時BEFOREトリガーのtri_temp_created_atをCREATE 
EACH ROW FORは
BEGIN 
    のIF 新しい.created_atがNULL IS 
    THEN 
        SET 新しい = .created_atを今(); 
    END IF; 
終わり; 
| 
区切り文字;

 

第三ソリューション

第三种、指定のcreated_atタイムスタンプDEFAULT '0000-00-00 00:00:00'、今UPDATE ON今UPDATE CURRENT_TIMESTAMP或者タイムスタンプDEFAULT ON指定のDEFAULT CURRENT_TIMESTAMP()updated_atの()。

表TEMP CREATE 
    IDのINT(11 )PRIMARY KEY AUTO_INCREMENT、
    名前VARCHAR(10 
    のcreated_atタイムスタンプNULLデフォルト' 0000-00-00 00:00:00 ' 
    UPDATE CURRENT_TIMESTAMP ONタイムスタンプNULLデフォルトCURRENT_TIMESTAMP updated_atの
)。

 

データを挿入します。

MySQLの> TEMP(名前、のcreated_at、updated_atの)\。INSERT INTO 
VALUES(' ロビン' 今、)(今、()); 
クエリOK、1つの影響を受けた行(0.01 秒)

のMySQL > TEMP INTO(名前、のcreated_at、updated_atの)\ INSERT 
(VALUES ' wentasy ' 今すぐに、()())。
クエリOK、1つの影響を受けた行(0.01秒)

 

ソリューション4

第四に、MySQLのは、MySQL 5.6の代替バージョンでは、この制限を削除しました。

私たちは、この質問に説明するのMySQL 5.5および5.6ヘルプドキュメントを見ることができます。

おすすめ

転載: www.cnblogs.com/ryanzheng/p/11495229.html