2

この問題を説明する最良の方法は、例を使用することです。

私はテーブルを持っています:

CREATE TABLE `example` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `data` varchar(255) DEFAULT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

結果:

   ID | データ | 作成 | 更新しました
 (ヌル)| (ヌル) | (ヌル) | (ヌル)

次に、いくつかのデータを挿入します。

INSERT INTO example (
  `data`
) VALUES (
  'abc123'
)

結果:

  ID | データ | 作成 | 更新しました
   1 | abc123 | 2013-01-16 13:12:16 | (ヌル)

そして、私は更新します

UPDATE example SET 
  `data` = 'def456',
  `updated` = NOW()
WHERE id = 1

結果:

  ID | データ | 作成 | 更新しました
   1 | def456 | 2013-01-16 13:16:24 | 2013-01-16 13:14:26

問題:createdフィールドも更新され、更新されたフィールドが正しく保存されるまでの時間がわずかに異なることに注意してください。このサンプルテーブルと他のテーブルを同じデータベースに同じようにセットアップしましたが、この問題はありませんでした。そのため、完全に困惑しています。

4

2 に答える 2

12

updatedする必要があります:TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

だからあなたは次のCREATE TABLEようになります:

CREATE TABLE `example` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `data` varchar(255) DEFAULT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

これはUPDATE、将来的に実行するときに、更新変数を渡す必要がないことを意味します。これは、MySQL が自動的に更新するためです :)

于 2013-01-16T11:31:43.590 に答える
2

これは、問題のテーブルテーブルが誤って作成された方法である可能性があります。

CREATE TABLE `example` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `data` VARCHAR(255) DEFAULT NULL,
  `created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `updated` DATETIME DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8;

おそらく誰かがサードパーティのソフトウェアを使用してそれを作成しましたか?

ON UPDATE CURRENT_TIMESTAMP作成日を破棄します。したがって、問題を解決するには、ALTER TABLE次のように使用します。

ALTER TABLE example CHANGE created created TIMESTAMP DEFAULT CURRENT_TIMESTAMP;

createdこれにより、更新のたびにフィールドの不要な上書きがなくなります。

于 2013-02-03T09:36:04.290 に答える