33

テーブルの作成中に、次のエラーが発生します。

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

問題は、実際にはデフォルトとして2つの列TIMESTAMPがなく、句を使用していないことです。CURRENT_TIMESTAMPON UPDATE

私が実行しようとしているDDLクエリは

CREATE TABLE user(
    /* Basic Information */
    id INT NOT NULL AUTO_INCREMENT,
    firstname VARCHAR(255) NOT NULL,
    surname VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    username VARCHAR(255) NOT NULL UNIQUE,
    password CHAR(40) NOT NULL,

    /* System status information */
    active BOOL NOT NULL DEFAULT FALSE,
    validated BOOL NOT NULL DEFAULT FALSE,
    date_validated TIMESTAMP,
    date_registered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

    /* Index */
    PRIMARY KEY (id)
) Engine=InnoDB;

問題の原因は何ですか?

4

3 に答える 3

37

1 つのテーブルで 2 つのタイムスタンプを使用できます。デフォルトでは、最初に DEFAULT フィールドを使用し、次に残りのタイムスタンプ フィールドを使用します。

以下のクエリが機能するはずです。

CREATE TABLE myTable 
(
 id INT,
 date_registered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
 date_validated TIMESTAMP
);

sqlfiddle でのデモ

于 2012-07-09T17:56:41.447 に答える
9

この制限は、MySQL 5.6.5 ではもはや存在しないことに注意することが重要だと思います。制限が取り除かれ、いくつかの追加機能が追加されました。具体的には、複数の TIMESTAMP フィールドと DATETIME フィールドに自動化されたデフォルトを設定できます。これにより、次のブログ投稿で説明されているように、フィールドが現在のタイムスタンプ/日時に設定されます (明らかに修正者によって書かれています): http://optimize- this.blogspot.com/2012/04/datetime-default-now-finally-available.html

より詳細
さらに、デフォルトの日付と時刻の値を生成する方法を正確に読むことは価値があるかもしれません。
以下のリンクで概説されているように、DATETIME と TIMESTAMP の両方のデータ型を設定できるため、特定の行の INSERT 操作の現在の日付と時刻の DEFAULT 値が列に含まれます。または、UPDATE 操作でフィールドに現在の日付と時刻を設定するために、ON UPDATE に設定することもできます。
リンク:
http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html

両方とも CREATE TABLE ステートメントでは次のようになります。

CREATE TABLE t1 (
ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
,ts2 TIMESTAMP DEFAULT NOW()
);

CURRENT_TIMESTAMP が NOW() のエイリアスであることは指摘しておく価値があります。
さらに、TIMESTAMP または DATETIME フィールドを NULL に設定すると、列 DEFAULT が日時値ではなく null に変更されます (詳細と詳細については、リンクを再度参照してください)。
もう 1 つの重要な点として、DATETIME には
1000-01-01 から 9999-12-31までの日付範囲を含めることができ
、TIMESTAMP には
1970-01-01 00:00:01 から 2038-01-19 03の範囲を含めることができます。 14:07
DATETIME と TIMESTAMP の追加の比較については、これらを比較するこの MySQL マニュアルページを読んでください。

于 2014-09-30T09:38:30.673 に答える
2

私自身のブログ投稿を引用させてください。

私がお勧めする方法は、タイムスタンプごとにトリガーを使用することです。

CREATE TRIGGER customer_create BEFORE INSERT ON `customer`
FOR EACH ROW SET NEW.created_at = NOW(), NEW.updated_at = NOW();

詳細については、投稿自体を参照してください。

于 2012-07-09T17:38:34.883 に答える