![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
phpmyadminを使ってmysqlのデータを更新しています。
掲載日:2008年5月25日
更新日:2012年6月04日
というようにphpで表示し、掲載順、更新順といったソートをしたいと思っています。
phpmyadminで作ったテーブルは
CREATE TABLE IF NOT EXISTS `data_data` (
`id` int(11) NOT NULL,
`name` char(10) NOT NULL,
`modified_date` date NOT NULL,
`create_date` date NOT NULL,
PRIMARY KEY (`id`),
KEY `modified_date` (`modified_date`,`create_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `data_data` (`id`, `name`, `modified_date`, `create_date`) VALUES
(1, '23434', '2012-06-04', '2012-04-02'),
(2, '464645', '2012-06-03', '2012-03-04'),
(3, '940968', '2012-06-03', '2011-03-23'),
・・・
(15000, '940968', '2012-06-03', '2011-03-23');
のようになっています。
SELECT * from data_data ORDER BY modified_date DESC LIMIT 0,50;
phpでこの構文で取得します。
・更新日を手作業で指定し直さないといけない。
・掲載日より前の日付で更新日を入ることができて、おかしくなってしまう。
といったことになってしまいます。
phpmyadminを使っている限り仕方がないのでしょうか。
たとえば、一流なサイトはどうやって掲載日・更新日を管理しているのしょうか。
No.4ベストアンサー
- 回答日時:
>modified_dateはそのときの日時に更新されますが、
>create_dateは更新されずに作成した日時のままです。
ああ、そういえば最近のMySQLはタイムスタンプカラムを2つ以上もてる
んでしたね、その場合ON UPDATE CURRENT_TIMESTAMP属性がついている
カラムが更新対象になるので、ご指摘のとおりとなると思います
ちなみにもともとはタイムスタンプは1テーブルに1つしか設定できないという
特性がありました、それは更新日時をいれるカラムなのだから二つ以上
同じ内容を入れておく必要がないという理由からでしょう
現在はポリシーもかわり二つ以上のタイムスタンプをもつことができるようになりましたが
前提としてタイムスタンプとはももと現日時を更新させるものですので
初回投入時にいれるような作成日時などには向いていないということです
タイムスタンプのもうひとつの特徴としては作成・更新日時をいれる器ですから
UNIXタイムの範囲だけ確保できればすむ分、確かにとりうる範囲が狭くてすみます
(つまり、はるか昔やはるか未来を持つ必要がないということです)
それでも検索効率やメモリに対する影響はさほど大きいとはいえないでしょうし
極力1テーブル1タイムスタンプは守るくせをつけておいたほうが無難かと
本当にありがとうございます。
そういう意味だったのですか、よく分かりました。
>前提としてタイムスタンプとはももと現日時を更新させるものですので
>初回投入時にいれるような作成日時などには向いていないということです
>極力1テーブル1タイムスタンプは守るくせをつけておいたほうが無難かと
どうしても自動に魅力があるので、タイムスタンプでやってみます。
よく覚えておきます。ありがとうございました。
この内容に関連するサンプルを作ってみたのですが、もしよければ見て下さい。
http://oshiete.goo.ne.jp/qa/7518982.html
No.3
- 回答日時:
>自動的に作成日時が指定されて、メモリも少ないtimestampでなく、
>datetimeの方がいいのはなぜでしょうか?
タイムスタンプにすると、レコードのどこかデータを修正すると
その時点の日時に書き変わってしまうので、「作成日」としては役にたたないです
もちろん投入したデータが金輪際書き変わらないない前提であれば
タイムスタンプでもいい気がしますが
>タイムスタンプにすると、レコードのどこかデータを修正すると
>その時点の日時に書き変わってしまう
nameのデータを変えると、
modified_dateはそのときの日時に更新されますが、
create_dateは更新されずに作成した日時のままです。
変更するカラムが1つだけだから?と思い、
カラムをもう1つ追加してみましたが、create_dateは更新されません。
バージョンが少し低いからですか?
Mysqlのバージョンは5.0.51a です。
そういうことでなく、誤動作だとcreate_dateが更新されやすいということでしょうか?
No.2
- 回答日時:
>| create_data | timestamp |
typoだとは思いますがクリエートデータ?
create_dateはレコードを最初に投入した日時を入れておくものだと
推察されるので、動的に更新されるタイムスタンプである必要はなく
datetime型がよいのでは?
またmodified_dateについては、わざわざ指定ししなくても
INSERTやUPDATEに応じて書き変わっていくので、INSERT項目からはずして
問題ないかと思います
datetime:自動更新無し・メモリの消費多い
timestamp:自動更新有り・メモリの消費少ない
http://www.dbonline.jp/mysql/type/index4.html
http://okwave.jp/qa/q5504237.html
>create_dateはレコードを最初に投入した日時を入れておくものだと推察
その通りです。
>動的に更新されるタイムスタンプである必要はなくdatetime型がよいのでは?
そうすると、ローを追加するときに手動で指定する必要が出てくると思います。
メモリの消費も多くなってソートとかするときにパフォーマンス的に心配です。
自動的に作成日時が指定されて、メモリも少ないtimestampでなく、
datetimeの方がいいのはなぜでしょうか?
>またmodified_dateについては、わざわざ指定ししなくても
>INSERTやUPDATEに応じて書き変わっていく
そうなんですか。ありがとうございます。
phpmyadminで追加するときに勝手に入ってしまっているので、
でもそれはそれで良いということですね。
No.1
- 回答日時:
>・更新日を手作業で指定し直さないといけない。
タイムスタンプをつかうなり、更新時にCURDATE()で上書きするなりしてみては?
>・掲載日より前の日付で更新日を入ることができて、おかしくなってしまう。
といったことになってしまいます。
もし手で更新日を入力する仕組みをつくっていれば、矛盾があって当然では?
ただし運用の問題なので、システムとしては特にないと思います
どうしても気になるなら更新日を手で触らせないようにすべき
http://isoldeblog.blog93.fc2.com/blog-entry-14.h …
http://www.dbonline.jp/mysql/table/index6.html
こちらを参考にして試してみました。
+---------------+-----------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-----------+------+-----+-------------------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | char(10) | NO | | NULL | |
| modified_date | timestamp | NO | MUL | CURRENT_TIMESTAMP | |
| create_data | timestamp | YES | MUL | NULL | |
+---------------+-----------+------+-----+-------------------+-------+
modified_dateの属性にはon update CURRENT_TIMESTAMPを設定し、
rowの追加をするときはmodified_dateはCURRENT_TIMESTAMPになっていて
create_dataは空のままにして実行ボタンを押すと、
INSERT INTO `data_test`.`data_data` (`id`, `name`, `modified_date`, `create_data`) VALUES ('6', '23456', CURRENT_TIMESTAMP, NOW());
というようになり自動的に日付が変わるようになりました。
このようなやり方で問題はないでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- MySQL SHOW CREATE TABLE posts;これって何ですか? 3 2022/08/28 22:57
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- MySQL MYSQL エラー 2 2022/10/18 11:37
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- MySQL MySQLのテーブル作成で 自信がありません。 2 2022/08/28 05:35
- PHP php エラー 2 2022/10/23 16:43
- MySQL テーブル作成です。どこかのスペルが間違っているか記号など スペースかな? 1 2022/10/01 05:08
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MySQLのUPDATE文でサブクエリ
-
PHPとMysqlを使用した集計表の...
-
【PL/SQL】DATE型の時刻の表示...
-
SQLローダーCSV取込で、囲み文...
-
テーブルの最後(最新)のレコー...
-
select文の実行結果に空白行を...
-
【PL/SQL】FROM区に変数を使う方法
-
単一グループのグループ関数で...
-
1の行を固定した上でVBAを用い...
-
データ
-
count関数の値をwhere句で使用...
-
SQL文 複数実行
-
AccessのSQL文で1件のみヒット...
-
並べ替えについて
-
枝番の最大値とその前のデータ...
-
SQL*Loader Append
-
group byの並び順を変えるだけ...
-
int型フィールドにnullを登録で...
-
レコードの登録順がおかしい
-
SELECTした合計値をそのまま割...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHP+MySQLで月ごとの数量を表...
-
日替わりメッセージを表示させ...
-
【PL/SQL】DATE型の時刻の表示...
-
MySQLのUPDATE文でサブクエリ
-
PHPとMysqlを使用した集計表の...
-
Strict Standards: date() ...
-
DB登録に関する日付の認識
-
EXCELマクロのSQL文での引用符...
-
PHPでMySQL内のデータの合計値...
-
JavaScriptの条件文の応用
-
postgresのカレンダーについて
-
掲載日と更新日の管理の仕方
-
SQLでMAXを使った
-
Smarty
-
JOINを使った文で、date > now();
-
SQLローダーCSV取込で、囲み文...
-
単一グループのグループ関数で...
-
select文の実行結果に空白行を...
-
テーブルの最後(最新)のレコー...
-
count関数の値をwhere句で使用...
おすすめ情報