5

データベース内のレコードが存在する場合は更新し、存在しない場合は挿入する SQL が必要です。これにはいくつかの解決策があるように見えますが、これを行うための正しい/受け入れられた方法が何であるかわかりません。

更新は両方のデータベースに対して実行する必要があるため、理想的には Firebird 2 と MySQL 5 の両方で動作することを望みます。プラスになるより多くのデータベースで動作する場合、同じ SQL が両方で実行された場合はより簡単になります。 .

速度と信頼性も考慮されます。この場合、速度よりも信頼性が優先されますが、数千のレコードを (異なるテーブルで) すばやく連続して更新するために使用される可能性があります。

任意の服従?

4

6 に答える 6

6

Firebird 2.1 では、単純なケースではUPDATE OR INSERTを使用でき、より複雑なシナリオではMERGEを使用できます。

于 2008-12-05T15:12:41.410 に答える
3

次のようなものを使用する必要があります。

BEGIN TRANSACTION
IF EXISTS (SELECT * FROM the_table WHERE pk = 'whatever')
    UPDATE the_table SET data = 'stuff' WHERE pk = 'whatever'
ELSE
    INSERT INTO the_table (pk, data) VALUES ('whatever', 'stuff')
COMMIT

または、これを個別に送信し、主キーの制約に違反することに関するINSERTからのエラーを無視します。

INSERT INTO the_table (pk, data) VALUES ('whatever', 'stuff')

UPDATE the_table SET data = 'stuff' WHERE pk = 'whatever'
于 2008-12-05T11:51:59.020 に答える
1

MySQLの場合は、次のREPLACEコマンドを試してください:http: //dev.mysql.com/doc/refman/5.0/en/replace.html

(Firebirdの同等物については、Milan Babuskovによるこの回答のコメントを参照してください。)

于 2008-12-05T11:36:09.960 に答える
0

REPLACEはINSERTとまったく同じように機能しますが、テーブル内の古い行がPRIMARY KEYまたはUNIQUEインデックスの新しい行と同じ値である場合、新しい行が挿入される前に古い行が削除されます。

構文:

REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name、...)]

{ VALUES | VALUE} 

({expr | DEFAULT},...),(...),...

一方:制約を操作するときは、REPLACEを避けるのが最善です。

于 2008-12-05T11:40:49.120 に答える
0

MySQLでINSERT を使用して行を更新しました。
INSERT INTO table () VALUES () ON DUPLICATE KEY UPDATE key
ただし、自動生成されたキーは使用できません。

于 2008-12-05T12:17:16.100 に答える