質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • PHP

    24054questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    7002questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • PDO

    382questions

    PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

mysql timestampにつきまして

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,416

SugiuraY

score 202

お世話になります。
(目的)
・MYSQLにINSERTまたはUPDATEしたタイミングで日付を自動でカラムに入力する設定をしたいと考えております。
(現状)
・入力したい日付のフォーマットはyyyy-mm-ddなのですが、デフォルト値にtimestampを設定した場合、必ずhh-ssまで含まれてしまう仕様になっているようです。
・一方でdateに設定し、デフォルト値、設定をCurrent time stamp,On update Current_TimestampをするとERROR 1067 (42000): Invalid default value for ‘xxx’と怒られます。

(ご質問)
実際にyyyy-mm-ddをInsert,Updateの度に自動で入れていきたい場合には、どのような方法をとればよろしいのでしょうか。通常はphp側の関数で日付を出力し、mysqlに格納していく方法が一般的なのでしょうか?

よろしくお願い申し上げます。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

INSERT、UPDATE時に明示的にCURRENT_TIMESTAMPを設定する方が、どこで現在日時が設定されるかが明白なため王道かと思いますが。

MySQLのマニュアルにあるように、

CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);


テーブル定義時に列制約として、
DEFAULT句、ON UPDATE句を指定すると質問者さんの望み通りの挙動となるのではないでしょうか?

追記

更新される際の精度が問題なのですね、失礼しました^^;

CREATE TABLE t1(
  dt DATETIME DEFAULT NOW() ON UPDATE NOW()
);


上記ではどうでしょう?
時分秒までは記録されますがDATETIMEなら、
DATE_FORMAT関数などでYYYY-MM-DD書式の指定が可能かと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/23 23:35

    ご回答いただき、誠にありがとうございます。
    初心者でありことを断りを入れるべきでした。
    ①つまりはカラムを定義する際に
    データ型>DATE
    デフォルト値>CURRENT_TIMESTAMP
    属性>on update CURRNET_TIMESTAMP
    の様に取り扱うことは不可能ということでしょうか?

    ②また、DATE_FORMATはphp側に値を渡す時に整形するイメージをおっしゃていますでしょうか?

    ③しばしばMYSQLで明示的にと表現されますが、具体的にどの様な意味合いで使用される単語なのでしょうか?『なんとなく特定のカラムを指定して』といった意味合いかと解釈をしているのですが。

    ④最後になりますが、本来の最終的な目的は毎日自動でInsertされるデータについて、日付を割り当て、whereで日付&idで初めてユニークとなり、一致するものをphpに出力することをイメージしています。その過程で書くレコードに日付を割り当てなければということで本質問に及んでいるのですが、そもそもこのようなアプローチは通常のプログラミングの試行にそうやり方でしょうか?
    例えば以下のようなカラムのイメージです。
    id:1date:2016/8/22 sale:300
    id:2date:2016/8/22 sale:400
    id:1date:2016/8/23 sale:200
    id:3date:2016/8/23 sale:100

    まだまだ不案内で申し訳ございません
    そして、度重なる質問にお詫び申し上げます。
    よろしくお願い申し上げます。

    キャンセル

  • 2016/08/24 00:31

    ①質問者様の提示するパターンでは列制約として定義するの今の所は不可能です。
    (今後できるようになるかもしれませんが)
    無理やり似たようなことをするのであればテーブルへのトリガーとして実装するという方法はありそうです。

    ②質問者様の認識通りです。

    ③便利さから明示的を多用するのはよくないですね、すみません。今回の場合ですと質問者様の認識通りで、INSERT、UPDATE時に列指定した上で現在日を設定して下さいという意図です。
    ただ「明示的」という言葉は文脈によって変わります。
    SQLでよく使われるパターンだと「データ型の変換を明示的に行う」があります。
    これはデータベース側でデータ変換を任せないで、
    「SQL自体にデータ変換処理を記述してね」という意味で使われています。
    (CASTなどがデータ変換用関数)

    ④IDと日付で一意ということ自体は違和感はありません。
    ただそのケースだと気をつけてもらいたいのは、
    1日に複数回同一ID情報を登録するパターンです。
    この場合ですと、当方が提示したCREATE文では要件を満たせません(時分秒違いで新しく一意のデータとなってしまうため。)

    なのでこのケースでは、
    質問者様も挙げていますDATE型を使う方が適切かと思います。

    それに加えて①の方法を取るには、トリガーなどを利用する手間が発生するので、
    個人的にはPHP側で更新値を与えるか、
    INSERT、UPDATEのクエリ内でCURDATE()として現在日を与える手段が良いと思われます。

    キャンセル

  • 2016/08/24 00:45

    丁寧なお返事を頂き、深く、深く感謝を申し上げます。まさに、ご指摘の通り、1日に一回更新なので、hhssがあると一意にならないたもに嵌った事が本家の起点でした。
    ご教示頂いた内容で全てクリアになりました!重ねて御礼申し上げます。
    宜しくお願い申し上げます。

    キャンセル

0

INSERTまたはUPDATEしたタイミングで日付を自動でカラムに入力する設定

普通は投入したいカラムを指定してCURDATE()などを渡してやるだけだと思いますが

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/24 00:05

    ご回答をいただき、ありがとうございます。そんな関数があるねですね、素人ですみません。大変勉強になりました、最もシンプルな方法かと思います。
    よろしくお願い申し上げます。

    キャンセル

0

一度もやったことないので試してみて?の範囲だけど

cast(NOW() as date)

みたいにキャストしてINSERTしたらどうなるかな?

MySQLはストリクトモードじゃなければなんでもいい感じにしてくれるので、勝手にNOW()を変換して入れてくれそうな気もするけど…

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/24 00:00

    ご回答いただき、ありがとうございます。ちょっとハードルが高そうですが、調べてみます!

    キャンセル

同じタグがついた質問を見る

  • PHP

    24054questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    7002questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • PDO

    382questions

    PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。