テーブルusersには、datetimeデータ型からなるregisterDate and lastVisitDate
という2つの列があります。私は以下のことをやりたいと思います。
0000-00-00 00:00:00
に設定します。テーブルは既に存在し、既存のレコードを持っているので、Modify tableを使用したいと思います。以下の2つのコードを使用してみましたが、どちらもうまくいきません。
ALTER TABLE users MODIFY registerDate datetime DEFAULT NOW()
ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP;
それは私にエラーを与えます:ERROR 1067 (42000): Invalid default value for 'registerDate'
MySQLでデフォルトのdatetime値をNOW()に設定することは可能ですか?
MySQL 5.6.5以降では、動的デフォルト値でDATETIME
型を使用できます。
CREATE TABLE foo (
creation_time DATETIME DEFAULT CURRENT_TIMESTAMP,
modification_time DATETIME ON UPDATE CURRENT_TIMESTAMP
)
あるいは両方のルールを組み合わせることもできます。
modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
参照:
http://dev.mysql.com/doc/refman/5.7/ja/timestamp-initialization.html
http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html
5.6.5より前では、レコードが変更されるたびに自動的に更新されるTIMESTAMP
データ型を使用する必要があります。しかし残念ながら、1つのテーブルには自動更新されるTIMESTAMP
フィールドは1つしか存在できません。
CREATE TABLE mytable (
mydate TIMESTAMP
)
参照してください。 http://dev.mysql.com/doc/refman/5.1/en/create-table.html
MySQLがUPDATE
のタイムスタンプ値を更新しないようにしたい場合(そのため、INSERT
でのみトリガーされるように)、定義を次のように変更できます。
CREATE TABLE mytable (
mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
回避策としてトリガーを使用して、新規挿入に対してdatetimeフィールドをNOW()に設定します。
CREATE TRIGGER `triggername` BEFORE INSERT ON `tablename`
FOR EACH ROW
SET NEW.datetimefield = NOW()
アップデートにも使えるはずです
Johan&Leonardoによる回答には、タイムスタンプフィールドへの変換が含まれます。質問で提示されたユースケース(RegisterDateとLastVisitDateの格納)ではおそらくこれで問題ありませんが、これは普遍的な解決策ではありません。 datetime vs timestamp の質問を参照してください。
私の解決策
ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;
MySQLのデフォルトのDATETIME値を設定しようとして心を失ったすべての人のために、私はまさにあなたがどのように感じるか感じたか知っています。だからここにあります:
`ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0
を囲む一重引用符/二重引用符は付けていませんであることに注意してください。
重要な更新:
この回答はさかのぼって投稿されました。当時、それは私の(おそらく最新の)MySQLのインストールに取り組んでいましたが、私はそれを共有したいと思いました。あなたが今この解決策を使うことに決める前に以下のコメントを読んでください。
mysql 5.6のドキュメントでは、CURRENT_TIMESTAMPはTIMESTAMPとDATETIMEの両方のデータ型のデフォルトとして使用できると述べています。
http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html
バージョンmysql 5.6.5以降では、正確な日時を使用してデフォルト値を設定することもできます。微妙なビットがあります、それはdatetimeとNOW()関数呼び出しの両方に精度値を渡すことです。
この例はうまくいきます:
ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW(6);
この例は機能しません。
ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW();
最善の方法は "DEFAULT 0"を使うことです。他の方法:
/************ ROLE ************/
drop table if exists `role`;
create table `role` (
`id_role` bigint(20) unsigned not null auto_increment,
`date_created` datetime,
`date_deleted` datetime,
`name` varchar(35) not null,
`description` text,
primary key (`id_role`)
) comment='';
drop trigger if exists `role_date_created`;
create trigger `role_date_created` before insert
on `role`
for each row
set new.`date_created` = now();
`ALTER TABLE `table_name` CHANGE `column_name`
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
更新時にタイムスタンプを更新するために使用できます。
ALTER TABLE table_name
CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
最後に、これは私のために働いた!
MySQLを使って、これは私のために働きました:
ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();