• ベストアンサー

SQLのキーの取り扱いについて

LinuxでMySQLの4.0.20を使っています。 auto_numberを用いたインサートを行った場合、通常デフォルトでも 自動的にオートナンバーが割り当てられるが、それを重複しないキーとして 使っているのですが、さきほど登録したオートナンバーを取得することは可能でしょうか? 最後に登録されたオート番号を取得するスマートな方法が知りたいです。 Aがauto_number testテーブル A B C 1 あ 10 2 い 20 3 う 30 この表を見れば、次の自体は4であろうと想像できるが、データを追加した直後に そのオートナンバーが何かわかる方法があれば知りたいです。 通常インサートする場合は固有のキーも追加するので、わざわざ取得するまでもないですが、特定できるキーがオートナンバーなので、それを取得する方法が知りたいです。 select max(A) from test; で取得すれば良いのでしょうか? ※4.1.4ではujisで日本語を追加しようとしてもうまくいきませんでした。バグが直ってなさそうです。

  • MySQL
  • 回答数2
  • ありがとう数11

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.2

LAST_INSERT_ID関数で、そのコネクション内で最後にAUTO_INCREMENTフィールドに生成されたIDが取得できます。 例 ----------------------------------------------- SELECT LAST_INSERT_ID(); --------------------------------------------------

参考URL:
http://www.mysql.gr.jp/Manual/mysql-4.00.12/manual.ja_Reference.html#IDX1347

その他の回答 (1)

  • RAPTsong
  • ベストアンサー率42% (74/175)
回答No.1

それでいいと思います。 select count(*) from test; か select max(A) from test; でよろしいかと。

関連するQ&A

  • INSERT文で発行したオートナンバーを取得したい

    いつも勉強させて頂いています。SQL文について困っています。 -環境- .NET FreamWork2.0 VB SQLSERVEREXPRESS -SQL- インサート時にオートナンバーを取得してデータを追加しているのですが、追加後にオートナンバーの値を戻す(取得する)ことは可能でしょうか?SQL文は下記です。 INSERT INTO マスタテーブル VALUES((SELECT MAX(オートナンバー) + 1 FROM マスタテーブル), 商品名・・・・ 上記で登録されたオートナンバーを別テーブルに格納したい為です、リアルタイムで処理しますので、発行したオートナンバーが即時に必要です。 テーブル更新時に  Dim Ret_Table As DataTable = AS_Cmd.ExecuteScalar() とするとテーブル内容がNothingになります。 他の方法も御座いましたら教えて頂けると幸いです。宜しくお願い致します。

  • SQL Server テーブル設計で悩んでいます。

    SQL Server 2008 R2 Visual Studio 2008 テーブルの設計で悩んでいます。 テーブルAのようなデータがあり、実際には、場所のNo.の数は500点くらいあります。 このデータをSQL to LINQでデータの追加、参照をしたいと思っています。 テーブルA,B、どちらの形式で設計する方がよいのでしょうか。 テーブルAの場合は、見た目がそのままで分かりやすいのですが、データ追加時(INSERT)に多数のデータを 追加する方法が分かりません。 テーブルBの場合は、テーブルAの形式で取得する場合、どうすればよいのか分かりません。 ここから先に進めず困っております。よろしくお願いします。 テーブルA 日付 No.1 No.2 No.3 No.4 No.5 2011/1/1 0 68 37 41 38 2011/1/2 3 60 3 69 46 2011/1/3 22 89 63 14 77 2011/1/4 75 8 55 46 41 2011/1/5 63 92 1 26 90 2011/1/6 61 23 77 42 93 2011/1/7 54 52 36 44 41 2011/1/8 72 98 30 66 48 2011/1/9 20 3 89 15 59 テーブルB 日付 場所 線量 2011/1/1 No.1 0 2011/1/1 No.2 68 2011/1/1 No.3 37 2011/1/1 No.4 41 2011/1/1 No.5 38 2011/1/2 No.1 3 2011/1/2 No.2 60 2011/1/2 No.3 3 2011/1/2 No.4 69 2011/1/2 No.5 46

  • Accessのテーブルへのデータインポートについて

    Accessのテーブルへのデータインポートについて Access2002で、A.mdbのTESTテーブルからB.mdbのTESTテーブル(構造は同じ)へテーブルデータをインポートしたいのです。 TESTテーブルの主キーはSEQ(オートナンバー)しかありません。 そのときに、コピー元とコピー先の主キーに重複があった場合、オートナンバーなので自動で再付番しデータが追加して欲しかったのですが、 Accessの機能のエクスポート、インポートでは、コピー先に主キーに重複があったデータは上書きされてしまいます。 テーブルを開き、データをコピー&ペーストしますと、ペーストしたときにオートナンバーで自動で再付番されます。 この方法でもいいのですが、データが数百万件あるので、現実的ではありません。 Accessのインポート・エクスポートで、オートナンバーで主キーを再付番してから、B.mdbのTESTテーブルにデータ追加する方法はないでしょうか? よろしくお願いいたします。

  • PHPでキーをstringで抜き出す関数ってないですよね?

    PHPでキーをstringで抜き出す関数ってないですよね? ■例 $a['test']; ■期待する結果 test ですが、1行でtestを取得する関数ってないですよね? ない場合、通常どのような関数で取得するのが良いでしょうか?

    • ベストアンサー
    • PHP
  • 1万件のレコードの追加方法、主キーは億単位で不規則

    テスト用のテーブルを作りたいと思っています。しかし、主キーの部分が実際とはかけ離れた状態になってしまいます。 フィールド数が複数あり、同じ値でも構わないので1万件分のレコードを追加したいです。 やり方としては、 <1>主キーのフィールド以外の全部のフィールドを作ってデータを入れます。 <2>そしてから、INSERT INTO `aaa` SELECT * FROM `aaa`を1万件超えるまで繰り返し実行。 <3>主キーのフィールドをauto_increment指定して追加します。 <4>1万を超えるフィールドを削除するためにDELETE FROM `aaa` WHERE id>10000を実行 ※実際には主キーにauto_incrementを入れません。 ※実際には主キーのデータは数千万~億単位(89234521や000455839)の数字(型はBIGINT)で、増加の仕方はまちまちです。 auto_incrementを使わず、数千万単位の数字で、増加の仕方もまちまちな主キーのデータを追加する方法はないでしょうか。

    • ベストアンサー
    • MySQL
  • 1SQLで書けないものでしょうか

    初めて投稿します。 よろしくお願いします。 現状、下記の様な構成のテーブルがあります。 DB :oracle9iR2 テーブル名:test 名前 型 ------- ------------- key_data VARCHAR2(10) rireki DATE read_data VARCHAR2(10) プライマリキーは、key_dataとrirekiです。 この、データの中から、key_data毎に最新のrirekiの情報だけを 取得したいと考えています。 そこで、下記の様にクエリーを組んでいたのですが、 select key_data, rireki, read_data from test inner join ( select key_data, max(rireki) AS rireki from test group by key_data ) test2 on (test.key_data = test2.key_data and test.rireki = test2.rireki) 複数のテーブルが、上記の様なキー項目と履歴を持つ形で 構成されている為に、複数のテーブルを結合すると途端に パフォーマンスが落ちて困っています。 ひょっとしたら、oracleなら分析関数か何かで1SQLで書けないものか (それで、処理速度が向上出来れば)と云うことで、自分で調べて みましたが、良い方法が見つかりません。 同様のお悩みをもたれた方で、対処法がありましたら教えていただけると幸いです。 よろしくお願いいたします。

  • SQLを教えてください

    下記表があり、列1のデータを列2,列3に分割する方法を 教えてください 表 :t_test 列0:管理No t_test_no VARCHAR2(7) NOT NULL PRIMARY KEY 列1:値(文字) *.**×10の乗数 t_test_data VARCHAR2(20) 列2:値(数値) 列1の「*.**」の部分 t_test_suu NUMBER(3,2) 列3:値(数値) 列1の「10の乗数」の部分 t_test_jousuu NUMBER(1,0) データ例 列0, 列1, 列2, 列3 A000001, 1.20×1, 1.2, 0 A000002, Null, Null, Null A000003, 1.23×100, 1.23, 2 A000004, 0.20×10000, 0.2, 4 A000005, 0.00×10, 0, 1 (補)列1に値がない場合もある

  • Access2003 オートナンバーの現在値取得方法

    Access2003 オートナンバーの現在値取得方法 Access2003 VBAでDAO.DBEngineオブジェクトを使用して テーブル定義の取得を行っています。 オートナンバー型のシーケンスの現在値を取得する方法はないでしょうか? MAX関数で最大値を取得する方法は不可です。

  • SQL文でどこが悪いのか教えて下さい

    初心者ですが教えて下さい。 表Aと表Bで表Aに含まれていないものを表Cに入れたいのですが、下記のやり方では表Aのものしか入れることができません。 どこが悪いのか教えて下さい。 ・コードは複雑なため、簡略化しています。UNIONは使わない方向で。 CREATE OR REPLACE PROCEDURE SAMPLE IS CURSOR SELLINE1 IS SELECT * FROM A ORDER BY KEY1,KEY2; CURSOR SELLINE2 IS SELECT * FROM B ORDER BY KEY1,KEY2; CNT1 NUMBER; CNT2 NUMBER; BEGIN SELECT COUNT(*) INTO CNT1 FROM C; IF CNT1 = 0 THEN FOR SELREC IN SELLINE1 LOOP INSERT INTO C VALUES (KEY1,KEY2,値);COMMIT; END LOOP; FOR SELREC IN SELLINE2 LOOP SELECT COUNT(*) INTO CNT2 FROM C WHERE (KEY1 = SELREC.KEY1) AND (KEY2 = SELREC.KEY2); IF CHK_CNT2 = 0 THEN INSERT INTO C VALUES (KEY1,KEY2,値);COMMIT; END IF; END LOOP; END IF; END; /

  • うまくPL/SQLが書けません。

    PL/SQLを作成しているのですが、うまくいかないので 質問させていただきました。SQL初心者ですがよろしければご教示ください。 テーブル名  カラム名 Bar       number numberには’AB734869 テスト’、‘AB364850 再テスト’ といった具合にまず8桁の番号が入り、その後データによってテキスト項目が続いています。 そしてnumberのデータへ、一律、頭から数えて5バイト目と6バイト目の間に’0000’という文字列を挿入したいと考えています。 例えば’AB734869 テスト’の場合は’AB7300004869 テスト’というようにしたいのですが、良い方法が思いつきません。 STUFF関数は使えませんし。。。UPDATEやINSERTを使ってやろうと思ったのですが、 どうしても出来ません。 皆様の知恵を拝借頂けたらと幸いです。 宜しくお願いいたします。 m(_ _)m