1

簡単に:

MySQL の奇妙な動作が発生しています。追加したくないのに更新時に CURRENT_TIMESTAMP属性が追加されています。なぜこれが起こっているのかを知りたいです-それはMySQLサーバーの問題ですか、それとも私が使用しているMySQL Workbench(v5.2.38)の問題ですか。

詳細:

EER ダイアグラムを使用してデータベース構造をモデル化しました。テーブルの例を以下に示します。

CREATE  TABLE IF NOT EXISTS `privilege` (
  `id` INT NOT NULL ,
  `name` VARCHAR(64) NOT NULL COMMENT 'privilege name (just a label)' ,
  `created_at` TIMESTAMP NOT NULL COMMENT 'when the privilege was created' ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;

上記のスクリプト フラグメントは、WorkBench 内で[エクスポート] > [Forward Engineer SQL Create Script ] を使用して作成されます。ここではcreated_at列が重要です。これは NOT NULL であり、レコードが定義されるときにタイムスタンプに定義されるデフォルト値はありません。したがって、created_at を定義せずにレコードを挿入しようとすると、エラーが発生すると思います。

このスクリプトを MySQL サーバー内で実行して、構造全体を作成します。そして、作成された構造は異なります - show create table privilegesは次を返します:

CREATE TABLE `privilege` (
  `id` int(11) NOT NULL,
  `name` varchar(64) NOT NULL COMMENT 'privilege name (just a label)',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE
  CURRENT_TIMESTAMP COMMENT 'when the privilege was created',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

「on update current_timestamp」はどこから来たのですか? 私が適切なオプションを選択しなかったことは 100% 確信しているので、MySQL は彼が求めていないものを作成するべきではありません。

なぜこれらの条項が追加されたのか、誰にも分かりますか?

4

1 に答える 1

3

自動初期化と更新でTIMESTAMP文書化されているように:

次のルールはTIMESTAMP、デフォルト値と自動更新値の両方、一方は他方ではない、またはどちらも現在のタイムスタンプでテーブルの最初の列を定義する可能性を示しています。

[ deletia ]

  • とのどちらDEFAULT CURRENT_TIMESTAMPも使用しない場合は、との両方をON UPDATE CURRENT_TIMESTAMP指定するのと同じです。DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP

[ deletia ]

TIMESTAMP最初の列の自動プロパティを抑制するには、次のいずれかを実行します。

  • DEFAULT定数のデフォルト値を指定する句を使用して列を定義します。

  • 属性を指定しNULLます。これにより、列でNULL値が許可されるようになります。つまり、列をに設定して現在のタイムスタンプを割り当てることはできませんNULL。割り当てるNULLと、列がに設定されNULLます。

于 2013-01-16T10:55:46.953 に答える