プロが教えるわが家の防犯対策術!

現在PHPで開発しています。
テーブル構造は下記の通りです。
CREATE TABLE `timetable` (
`ID` int(3) unsigned NOT NULL auto_increment,
`gettime` int(10) unsigned default NULL,
`code` varchar(20) default '0', //英数字が入る
`time` varchar(50) default '0', //日本語が入る
`timeh` datetime default NULL,
PRIMARY KEY (`ID`),
KEY `gettime` (`gettime`)
) ENGINE=MyISAM DEFAULT CHARSET=ujis
これでふつうに
select ID,gettime,code from timetable where code='xxx'
とすると
------------
16435 5 xxx
16434 4 xxx
16433 3 xxx
16432 2 xxx
16431 1 xxx
と取得されてしまい、IDの昇順になってくれません。
select * でも同様です。LIFO型になっているように見られます。

ご助言いただきたいのは
・MySQLの場合、こうなることはあるのか、原因は何か
・対応としてはorder by をつける以外にないのか
 (テーブルの構造、設定を変えることで対応可能か)

です。お忙しいと存じますが宜しくお願い致します。

A 回答 (3件)

殆どのRDBMSでは、以下を保証していません。



(1)「order by」指定なしでのプライマリキー順などの順序保証
(2)「order by」指定なしでの格納順などの順序保証

MySQLでも、「order by」指定なしで、「プライマリキー順になったり、格納順になったり」といったことは、一切保証されていません。
マニュアルにも「order by指定がない場合は、順序保証しない」ことは明記されています。
また、「明記されていないが、実は格納順になるのでは?」というのを実験して、「確実には格納順にならない」という実験結果を公開しているサイトもあります。

例外的にSQL Serverでは、「order by指定なし」でプライマリキー順を保証しているようですが、これは例外中の例外と言えます。
    • good
    • 1
この回答へのお礼

ありがとうございました!

お礼日時:2007/04/02 16:35

逆でしたか・・・失礼しました。



ですが、結果は同じです。
後から追加したのが最新なので上になります。
    • good
    • 0

------------


16435 5 xxx
16434 4 xxx
16433 3 xxx
16432 2 xxx
16431 1 xxx
(16431~16435)までが時間で(1~5)までがIDですよね?
後から追加したのが最新なので上に来るのではないですか?
降順にするのにはorder by をつけるしかないでしょうね。

この回答への補足

>(16431~16435)までが時間で(1~5)までがIDですよね?
いえ、違います。逆です。IDが5ケタの数値のほうです。

補足日時:2007/03/30 14:15
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す