none
C#からDataBaseにデータをInsertした後の戻り値について RRS feed

  • 質問

  • こんにちは。

    C#から発行したInsertSQLで
    auto_incrementの属性を持つテーブルに
    一行のデータをInsertした後、
    Insertした行のauto_incrementシリアル番号を取得したいですが、
    何かの方法がありますか?

    データベースはMySQLを使ってます。

    宜しくお願いいたします。

    2010年12月20日 4:11

回答

  • すみません。調べてみたら、答えが見つかりました。

    http://dev.mysql.com/doc/refman/5.1/ja/information-functions.html

     

     

    LAST_INSERT_ID() , LAST_INSERT_ID(expr )

    MySQL 5.1.12 以降では、LAST_INSERT_ID() ( 引数なし ) は、最も最近に実行された INSERT 文の結果として AUTO_INCREMENT カラムに正常に インサートされた、自動的に生成された最初の 値を戻します。LAST_INSERT_ID() の値は、正常にインサートされた行がない場合は、未変更のままになります。

    例えば、AUTO_INCREMENT 値を生成する行をインサートした後は、次のようにして値を得ることができます :

    mysql> SELECT LAST_INSERT_ID();
    
    
    -> 195

    MySQL 5.1.11 以前では、LAST_INSERT_ID() ( 引数なし ) は、行が正常にインサート、または更新された場合、自動低に生成された最初 の値を戻します。つまり、戻された値は、テーブルに正常にインサートされなかった値である可能性があります。正常にインサートされた行がなければ、LAST_INSERT_ID() は 0 を戻します。

    LAST_INSERT_ID() の値は、INSERT または UPDATE 文のすべての行が正常である場合、全バージョンにわたって一貫するでしょう。

    実行中のステートメントが、LAST_INSERT_ID() の値に影響をおよぼすことはありません。ひとつのステートメントで AUTO_INCREMENT 値を生成し、その後、独自の AUTO_INCREMENT カラムで行をテーブルにインサートする複数行の INSERT 文で、LAST_INSERT_ID() を照会すると仮定します。LAST_INSERT_ID() の値は 2 番目のステートメントに安定したまま残ります。2 番目以降の行でのその値は、以前の行の挿入に影響されません。( しかし、LAST_INSERT_ID()LAST_INSERT_ID(expr ) への参照を混ぜると、その効果は未定義になります ) 。

    以前のステートメントがエラーを戻した場合、LAST_INSERT_ID() は未定義になります。トランザクション テーブルでは、ステートメントがエラーによってロールバックされる場合、LAST_INSERT_ID() は未定義のまま残されます。手動の ROLLBACK では、LAST_INSERT_ID() の値はトランザクションの前に復元されず、ROLLBACK 時点と同じまま残ります。

    ストアド ルーチン ( プロシージャまたは関数 ) もしくはトリガのボディ内で、LAST_INSERT_ID() の値は、これらの種類のオブジェクトの外で実行されたステートメントと同様に変化します。後に続くステートメントに参照される LAST_INSERT_ID() の値に基づくストアド ルーチンもしくはトリガの効果は、ルーチンの種類によって異なります :

    • ストアド プロシージャが LAST_INSERT_ID() の値を変えるステートメントを実行する場合、変更された値はプロシージャ呼び出しに従うステートメントによって参照されます。

    • 値を変更するストアド ファンクションやトリガでは、値は関数やトリガが終了した時に復元され、続くステートメントは変更された値を参照しません。

    生成された ID は、接続ベースで サーバ内で保持されます。つまり、関数によって指定のクライアントに戻された値は、そのクライアントによって AUTO_INCREMENT カラムに影響を及ぼす最も最近のステートメントのために生成された、最初の AUTO_INCREMENT 値です。この値は、他のクライアントが独自の AUTO_INCREMENT 値を生成した場合でも、他のクライアントによって影響を受けることはありません。この動作は、各クライアントが他のクライアントの動向を気にせず、ロックやトランザクションなしで、独自の ID を呼び出せるようにします。

    行の AUTO_INCREMENT カラムを 非 「magic 」 値 ( NULL でも 0 でもない値 ) に設定する場合、LAST_INSERT_ID() の値は変更されません。

    重要点 : 単一の INSERT 文を使用して複数の行をインサートする場合、LAST_INSERT_ID() は、最初の インサートされた行のみ に対して生成された値を戻します。これは、他のサーバに対して同じ INSERT 文を簡単に再現できるようにするためです。

    • 回答としてマーク Pinokio-k 2010年12月20日 4:38
    2010年12月20日 4:38

すべての返信

  • C#にはデータベースを扱う方法が多数 あり、どのクラスを使うかによってぞれぞれ答えが異なります。というわけでどのクラスを使うのでしょうか?

    2010年12月20日 4:36
  • すみません。調べてみたら、答えが見つかりました。

    http://dev.mysql.com/doc/refman/5.1/ja/information-functions.html

     

     

    LAST_INSERT_ID() , LAST_INSERT_ID(expr )

    MySQL 5.1.12 以降では、LAST_INSERT_ID() ( 引数なし ) は、最も最近に実行された INSERT 文の結果として AUTO_INCREMENT カラムに正常に インサートされた、自動的に生成された最初の 値を戻します。LAST_INSERT_ID() の値は、正常にインサートされた行がない場合は、未変更のままになります。

    例えば、AUTO_INCREMENT 値を生成する行をインサートした後は、次のようにして値を得ることができます :

    mysql> SELECT LAST_INSERT_ID();
    
    
    -> 195

    MySQL 5.1.11 以前では、LAST_INSERT_ID() ( 引数なし ) は、行が正常にインサート、または更新された場合、自動低に生成された最初 の値を戻します。つまり、戻された値は、テーブルに正常にインサートされなかった値である可能性があります。正常にインサートされた行がなければ、LAST_INSERT_ID() は 0 を戻します。

    LAST_INSERT_ID() の値は、INSERT または UPDATE 文のすべての行が正常である場合、全バージョンにわたって一貫するでしょう。

    実行中のステートメントが、LAST_INSERT_ID() の値に影響をおよぼすことはありません。ひとつのステートメントで AUTO_INCREMENT 値を生成し、その後、独自の AUTO_INCREMENT カラムで行をテーブルにインサートする複数行の INSERT 文で、LAST_INSERT_ID() を照会すると仮定します。LAST_INSERT_ID() の値は 2 番目のステートメントに安定したまま残ります。2 番目以降の行でのその値は、以前の行の挿入に影響されません。( しかし、LAST_INSERT_ID()LAST_INSERT_ID(expr ) への参照を混ぜると、その効果は未定義になります ) 。

    以前のステートメントがエラーを戻した場合、LAST_INSERT_ID() は未定義になります。トランザクション テーブルでは、ステートメントがエラーによってロールバックされる場合、LAST_INSERT_ID() は未定義のまま残されます。手動の ROLLBACK では、LAST_INSERT_ID() の値はトランザクションの前に復元されず、ROLLBACK 時点と同じまま残ります。

    ストアド ルーチン ( プロシージャまたは関数 ) もしくはトリガのボディ内で、LAST_INSERT_ID() の値は、これらの種類のオブジェクトの外で実行されたステートメントと同様に変化します。後に続くステートメントに参照される LAST_INSERT_ID() の値に基づくストアド ルーチンもしくはトリガの効果は、ルーチンの種類によって異なります :

    • ストアド プロシージャが LAST_INSERT_ID() の値を変えるステートメントを実行する場合、変更された値はプロシージャ呼び出しに従うステートメントによって参照されます。

    • 値を変更するストアド ファンクションやトリガでは、値は関数やトリガが終了した時に復元され、続くステートメントは変更された値を参照しません。

    生成された ID は、接続ベースで サーバ内で保持されます。つまり、関数によって指定のクライアントに戻された値は、そのクライアントによって AUTO_INCREMENT カラムに影響を及ぼす最も最近のステートメントのために生成された、最初の AUTO_INCREMENT 値です。この値は、他のクライアントが独自の AUTO_INCREMENT 値を生成した場合でも、他のクライアントによって影響を受けることはありません。この動作は、各クライアントが他のクライアントの動向を気にせず、ロックやトランザクションなしで、独自の ID を呼び出せるようにします。

    行の AUTO_INCREMENT カラムを 非 「magic 」 値 ( NULL でも 0 でもない値 ) に設定する場合、LAST_INSERT_ID() の値は変更されません。

    重要点 : 単一の INSERT 文を使用して複数の行をインサートする場合、LAST_INSERT_ID() は、最初の インサートされた行のみ に対して生成された値を戻します。これは、他のサーバに対して同じ INSERT 文を簡単に再現できるようにするためです。

    • 回答としてマーク Pinokio-k 2010年12月20日 4:38
    2010年12月20日 4:38
  • C#との関連性が全く見えないのですが…MySQLのサイトで聞くべき質問だったのかも。
    2010年12月20日 9:57