• ベストアンサー

レコードの登録順がおかしい

レコードをinsertで登録した場合、selsect * from で見ると普通最終行に反映されるものなんですよね? それが現状、最終行の一行前だとか、続けて登録すると最終行になったり、その次の登録はn行前になったりと統一性がなく困ってます。 このようになってしまう原因と解決法をご存じでしたらご教授願えませんでしょうか。 当方、MySQL3.22.32-2を使ってます。

質問者が選んだベストアンサー

  • ベストアンサー
  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.2

よくあるのは、間のデータを削除した場合に、その場所に新しく書き込むものが入るパターンですね。 SQLはデータの保存を効率よくするために、書き込みの順番という概念はありません。 順番に並べたい場合は#1の方がおっしゃるように、どこかで順番を保存して、それをソートすることになります。 例えば、 select * from table order by A というようになります。

izukunzo
質問者

お礼

回答ありがとうございます。 間のデータ、確かに消しました。 なるほどー。納得しました。(^-^) order by、試してみたところ、ちゃんと順番に表示されました。 今後はorder byで確認するようにします。 ご教授ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • blader318
  • ベストアンサー率52% (23/44)
回答No.1

>普通最終行に反映されるものなんですよね? そんな風に決まってはいません。 select * from と出力順の指定を何も付けずに検索した場合の検索結果には、登録順に出力されるという保証はありません。登録順に出力したいのであれば、通常は、レコードの登録日時をカラムとして持っておいてそれでソートを行います。

izukunzo
質問者

お礼

回答ありがとうございます。 保証はないのですか・・・ 勉強になりました。 さらに質問なのですが、ここ2カ月、select * fromで登録順に表示されていたものが(一日一件登録、毎日最終行に例外なく反映されていた)、ある日突然(本日)最終行のn行前とかに表示されてしまうのはちょっと???です。 2カ月前から、レコードの登録日時としてvarchar属性で050922_0930のように入力していますが、一度としてそれでソートをかけたことはなく、select * fromで登録(日時ではなく)順に表示されていました。 これの原因はなぜなのでしょうか? 宜しくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 1フォームで複数レコードの登録

    こんにちは。初心者です。 PHP(4)とMYSQL(4.0.20)でデータの登録について お教え頂きたいことがございます。 1つの入力フォームで入力したものを 複数レコードに登録したいと思っております。 社員番号  時間外  勤務日数 (   ) (  ) (  ) (   ) (  ) (  ) (   ) (  ) (  ) (   ) (  ) (  ) (   ) (  ) (  ) ( )がINPUTの枠になります。 これを1行を1レコードとしてDBに登録していきたいと 思っております。 こういったことは可能でしょうか? 参考になる本やサイトがあれば、お教えいただければ 幸いです。 申し訳ありませんが、お教え頂きますよう お願い致します。

    • ベストアンサー
    • PHP
  • レコード追加に要する時間について。

    insert文でレコードを追加する際、すでにテーブルに登録されているレコードが多ければ多いほど、insert文でレコードを追加する時間は長くなるのですか?できればその理由もご存知な方ご教授おねがいします。 OSとDBのバージョンは以下です。 OS:Solaris8 DB:Oracle8

  • レコードなしは挿入、レコードありは更新する方法

    該当レコードなしのときは挿入、該当レコードがあるときは更新する方法を教えてください データベース初心者です 該当レコードなしのときは挿入(INSERT)、該当レコードがあるときは更新(UPDATE)する方法を教えてください。 MySQL 5.0.67 レコードは下記のようになります。 desc table; +----------+----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+----------------------+------+-----+---------+-------+ | val1 | smallint(6) | NO | PRI | 0 | | | val2 | smallint(6) | NO | PRI | 0 | | | val3 | smallint(6) | NO | PRI | 0 | | | date_y | char(4) | NO | PRI | | | | date_m | char(2) | NO | PRI | | | | pre | bigint(19) | NO | | 0 | | | now | bigint(19) | NO | | 0 | | +----------+----------------------+------+-----+---------+-------+ 下記のSQL文で更新を行いました。 UPDATE table as c, ( SELECT val1, val2, val3, now FROM table WHERE date_y='2010' and date_m='10' ) as n SET c.pre=n.now, c.now=n.now WHERE c.val1=n.val1 and c.val2=n.val2 and c.val3=n.val3 and c.date_y='2010' and c.date_m='11'; このSQL文をINSERT~ON DUPLICATE KEY UPDATEにした場合、どのようなSQL文になるのかをご教授頂ければ幸いです。 一応、下記URLを参照したのだけど、うまくSQL文が書けませんでした。 12.2.4.3. INSERT ... ON DUPLICATE KEY UPDATE 構文 http://dev.mysql.com/doc/refman/5.1/ja/insert-on-duplicate.html 以上、宜しくお願い致します。

  • 一行目のレコードを2度表示させたい。

    レコードを読み込むのとは別に、最終書き込み者(ソートした最初のレコード)を表示させたいのですが、mysql_fetch_array($rst)を読み込ませると1位行目が消え、次ぎにmysql_fetch_array($rst)が読み込む時には2行目からになります。 ------------------------- 最終書き込み者 一太郎さん「一番目のタイトル」 -レコードの一覧- □一太郎 一番目タイトル □次郎  2番目のタイトル □佐武郎 三番目のタイトル ------------------------- としたいのですが。 SQLを2度実行すればできるのですが、無駄な処理な気もします。 別のテーブルやこの情報だけtextに保存するのも無駄な気もするし。 //一番目をゲット $sql = "select * from siritori order by db_no desc limit 1;"; $rst = mysql_query($sql,$con); //$rst2 = $rst; $col = mysql_fetch_array($rst); print "最終書き込み者".$col["name"]."さん".$col["title"]."<hr>"; //一覧を表示 $sql = "select * from siritori order by db_no desc limit 10;"; $rst = mysql_query($sql,$con); //SQL配列読み込み(select文) while($col = mysql_fetch_array($rst)){ print $col["name"]."さん".$col["title"]."<br>".$col["kome"]."<hr>";} //$rst2 = $rst; 配列をコピーできないかなー?とかもやったのですができない。 なんとか巧い解決方法はないでしょうか? 連想配置や、MySQLには詳しくないのでお教えください。

    • ベストアンサー
    • MySQL
  • MYSQLのレコードを上書きしたいのですが…

    phpからMYSQL5に接続して以下のようなデータベースを作りました。 no name comment ←カラム名 1  山田 起きる 2  山田 叫ぶ 3  山田 寝る これを上書きして、 no name comment 1  山田 食べる 2  山田 遊ぶ 3  山田 寝る というようにレコードを更新したいのです。 しかし、どうやっても1、2、3の後に4、5、6と続いてしまいます。 「no」カラムにはauto_increment+primary keyを設定しています。 phpで構文を送る前に mysql_query("alter table db1 auto_increment=0"); を設定してみたり、 mysql_query("insert into db1 (name,comment) value ('山田','$comment')"); や mysql_query("replace into db1 (name,comment) value ('山田','$comment')"); を試してみましたが、上手く行きませんでした。 現在は、 mysql_query("delete from db1"); mysql_query("alter table db1 auto_increment=0"); ---php処理--- mysql_query("insert into db1 (name,comment) value ('山田','$comment')"); というように、二度目の書き込みを行う前に一旦テーブル内のレコードを すべて削除して書きなおすという方法を取っています。 しかし、数が多くなると一旦削除する作業を行うと処理が遅くなってしまうと思いますので、上書きしてデータベースを更新したいと思っているのですが、どのようにすればよいでしょうか?

    • ベストアンサー
    • MySQL
  • ON DUPLICATE KEY UPDATE

    こんにちは。 PHP + MYSQL でシステム構築をしております。 この度は、新しいレコードを INSERT するが、もしもINSERT するレコードのうちの主キーが既に存在する場合は、UPDATE を行うという処理をしたいと思っています。 調べているうちに MySQL 4.1.0 の新機能である ON DUPLICATE KEY UPDATE 節というものがありましたが、4.1.0以前の MYSQL を利用の場合はどのようにするのが最適でしょうか? 私が考えたのは、挿入前に主キーを持つレコードを読み込んで、レコードが返ってこなかった場合は INSERT、何かレコードが返ってきた場合は UPDATE というようにする方法ですが、少し回りくどい気もします。 クエリのみで、またはシンプルな方法でこれを解決する方法はありますでしょうか? ご教授お願いいたします。

    • 締切済み
    • PHP
  • デフォルトでデータが表示される順番

    質問があります。 oracle初心者です。 oracle8.1で insert文によってデータを登録すると 一番最後のレコードに表示されません。 select文(select * from "テーブル名")を 書いて全レコードを抽出すると、中途半端な位置に 最新レコードが表示されます。 デフォルトでテーブルのデータが表示される位置に 決まりというのはあるのでしょうか MYSQLでは最後の行に最新レコードが表示されるはずですが、 オラクルでは違うのでしょうか。 もちろん、文字コード順や数値の順番ではないみたいです。 困っていますご回答よろしくお願いします。

  • もっとも新しいレコードから検索する方法

    MySQLにデータを登録しており、PHPにてWebサイトにデータを表示しています。SQLはSELECT * FROM TABLE WHERE .... なんですが、この場合一番初めのレコードから順に表示されてしまうため、古いデータがはじめに、新しいデータが最後尾に表示されてしまいます。 これを解消するため最後尾のレコードから検索するにはどうしたらよいのでしょうか?又、カテゴリが異なってしまいますが、PHPでもっとよい方法などございましたらお願いします。

    • ベストアンサー
    • MySQL
  • レコードに改行コードが含まれていると復元できない

    現在MySQLデータの移行テストをしています。 移行元サーバは4.0.27 EUC-JP 移行先サーバは5.1.55 UTF-8です。 mysqldumpでダンプデータを作り、terapadで文字コードをEUCからUTF-8Nに変換しています。 移行先サーバにデータを復元しようとすると、改行コード(\r\n)が含まれているレコードをINSERTするところで、エラーになってしまいます。(エラー内容はIncorrect database nameやUnknown MySQL server hostなどまったく関係のないものです) どなたか解決方法がお分かりでしたらよろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 2つのテーブルからレコードを抽出する方法

    お世話になります。MySQLに関する質問です。 TABLE1とTABLE2の2つのテーブルからレコードを抽出する際、 TABLE1からは全項目のデータを取得し、TABLE2からは一部の項目の データを取得したいと考えています。 条件は、TABLE1とTABLE2を[No]という項目の値で紐(ひも)づけます。 (1) SELECT * FROM TABLE1 (2) SELECT COL_A, COL_B, COL_C FROM TABLE2 上記(1)(2)のレコードを1つのSQLで取得する方法について、どなたかご教授願えますか?

    • ベストアンサー
    • MySQL