6

以下のような表があります。MySQLの1つのデフォルトの列制限を回避するために、ここに示すようなヒントを使用しました

CREATE  TABLE IF NOT EXISTS mytable (
  id INT NOT NULL AUTO_INCREMENT ,
  create_date TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00' ,
  update_date TIMESTAMP NULL DEFAULT NOW() ON UPDATE NOW() ,
  PRIMARY KEY (`parti_id`) )
ENGINE = InnoDB;

私のsql_modeには、ここでNO_ZERO_DATE指摘したように私の出力が含まれていません:

mysql> SELECT @@sql_mode;
+------------+
| @@sql_mode |
+------------+
|            | 
+------------+
1 row in set (0.00 sec)

以下に示すように、まだエラーが発生しています。

ERROR 1067 (42000) at line xx in file: '/myschema.sql': Invalid default value for 'create_date'

UbuntuでMySQL5.1.37を使用しています

どうすれば修正できますか?ありがとう。

4

4 に答える 4

12

テーブルごとに、またはデフォルトのタイムスタンプ列を1 つだけ持つことができます。これは、MySQL のよく知られたバグです。CURRENT_TIMESTAMPNOW()

これを克服するには、作成された列のデフォルトを有効なタイムスタンプ値にしてから、CRUD アプリケーション コードにタイムスタンプを挿入します。NOW()またはを使用CURRENT_TIMESTAMPして、更新された列のデフォルトを指定します。

参考資料: http://dev.mysql.com/doc/refman/5.1/en/timestamp.html

この分野における MySQL の欠点をさらに説明するために、次のコードを検討してください。

CREATE TABLE testing_timestamps (
  id INT NOT NULL AUTO_INCREMENT,
  pk_id INT NOT NULL,
  col1 TIMESTAMP DEFAULT 0,
  col2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY(id)
);

delimiter $$
CREATE TRIGGER testing_timestamps_trigger
  AFTER INSERT ON testing_timestamps
  FOR EACH ROW 
  BEGIN
    UPDATE testing_timestamps SET col1 = NOW() WHERE id = MAX(id);
  END;
$$
delimiter ;

INSERT INTO testing_timestamps (id) VALUES (0);

この出力は次のように表示されます。

mysql> INSERT INTO testing_timestamps (id) VALUES (0);
ERROR 1442 (HY000): Can't update table 'testing_timestamps' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

このインスタンスでトリガーを使用すると良い回避策になるため、これは残念です。

于 2009-09-22T23:47:22.613 に答える
7

実際、ランディのコードは壊れています。変異トリガーなので効きません。更新を開始したテーブルを更新することはできません。たとえば、テーブル SESSIONS を更新している場合、UPDATE、INSERT、または DELETE ステートメントを使用してトリガーでテーブルを変更することはできません。トリガーがアタッチされているテーブルを変更できる唯一の方法は、以下に示すように「NEW」または「OLD」プレフィックスを使用することです。(もちろん、自由に他のテーブルを更新することができます。) 以下は、op で説明されている問題を克服する方法の例です。

create table sessions (
    id integer not null,
    created timestamp not null default 0,
    updated timestamp not null default 0
);

delimiter //
create trigger bifer_sessions_ts before insert on sessions for each row
begin
    set new.created = now();
    set new.updated = now();
end;
//
create trigger bufer_sessions_ts before update on sessions for each row
begin
    set new.updated = now();
end;
//
delimiter ;
于 2011-05-24T01:23:12.167 に答える
1

これを実行して動作させるには:

col1 TIMESTAMP DEFAULT 0,

col2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 

col1 のトリガーは必要ありません。クエリで値が NULL であることを確認してください。答えは認定ガイドにあります。

于 2012-08-29T14:44:10.267 に答える