0

プログラミング言語では、戻り値が最も基本的なものであることは誰もが知っています。しかし、データベースに関して言えば、戻り値はまったく期待していません。これは間違った概念です。データベースがブラック ボックスになってしまうからです。更新によってどの行が影響を受けるかなど、知っておくとよい場合があります。

では、挿入または更新後に値を返すデータベースを構築するにはどうすればよいでしょうか? (これは常に値自体を返すため、選択後ではありません)

また、更新された行の主キーを持つリストなど、MySQL などのサンプル コードを教えてください。

4

4 に答える 4

1

ここで引用されている、この関連するSOトピック@Erwin Brandstetterによる回答にリンクしています)を読むことをお勧めします。

PostgreSQLでは、RETURNINGを使用できます。
OracleにもRETURNINGがあります。
SQL-ServerにはOUTPUTがあります。
しかし、MySQLにはそのようなものはありません。

于 2013-03-03T19:57:27.417 に答える
0

トランザクション内で更新する前に値を選択することをお勧めします。https ://stackoverflow.com/a/10663439/2115135 更新はまだ失敗する可能性があるため、戻り値を使用する前に考慮してください。

于 2013-03-03T19:56:32.843 に答える
0

使用する実行方法にもよりますが、通常、mysqlデータベースで実行される書き込み操作の影響を受ける行数を取得できます。複数の方法があります。ステートメントをバッチとして明示的に実行できます。

SELECT ROW_COUNT()

最後に、または接続ライブラリによって提供される機能を使用して、最後のセットで影響を受けた行の数を取得できます

例:PHPでは次を使用できます

mysqli::$affected_rows

影響を受ける行を取得するため。

編集:特定のシナリオはありますか、もっと例が欲しいですか?

更新:質問の2番目の部分に答えるため。

まあ、私が知っている同じステートメントで影響を受ける行の主キーを取得する方法は絶対にありません。他のユーザーからの回答例に記載されているように、ステートメントバッチを実行する必要があります。

トランザクションを開始します。SELECT primary_key_columns FROM my_table WHERE status ='O' FOR UPDATE; UPDATE my_table SET status ='E' WHERE status ='O'; 専念; 詳細はこちら:[https://stackoverflow.com/questions/10663338/i-need-primary-keys-of-the-affected-rows-to-be-returned-after-updating-a-table-i] [ 1]


編集以下のコメントでマーカスによって与えられた情報に基づいて答えを修正しました。

更新ステートメントの影響を受けるすべての行のIDを取得するには:

SET @uids := null;
UPDATE footable
   SET foo = 'bar'
 WHERE fooid > 5
   AND ( SELECT @uids := CONCAT_WS(',', fooid, @uids) );
SELECT @uids;

これにより、すべてのIDがコロンで連結された文字列が返されます。ソース:MySQLで最後に更新された行のIDを取得する方法は?

@fenwayの回答で言及されている他のオプションは、サポートされているデータベースの出力句です。

その場合でも、上記と同じ手順に従ってデータを送り返す前に、基本的に値を入力する必要があることに注意してください。

さて、あなたは、データベースが主キー値を自動的に返さないのはなぜか疑問に思っていると思います。まあそれはという事実と関係があります

1)DBは、すべてのテーブルに主キーを設定することを要求しません。実際には、私たちが定義したUNIQUE制約です。

2)すべてのシナリオで、影響を受ける主キーを返す必要はありません。ほとんどの通常のユースケースでは、更新後、影響を受ける行を最大で必要とします。

リレーショナルDBプログラミングには、通常の問題セットプログラミングとは少し異なる考え方が必要であることを忘れないでください。

少なくともこれらは私の2セントです。

よろしく

シュレヤスN

于 2013-03-03T19:57:38.137 に答える
0

これを実現する1つの方法は、updateステートメントと同じフィルターを持つselectステートメントを使用することです。ただし、各呼び出し間でデータが変更されないように、両方のクエリが同じトランザクション内で実行されることを確認してください。

{

update Customers set CITY = 'CHICAGO'

where ContactFName = 'Dan'

//execute query

select CustomerID from Customers

where ContactName = 'Dan'

//execute reader
//while the reader returns a row, set that return value to an element in a list 

//commit transaction

}//Transaction
于 2013-03-03T20:27:27.933 に答える