phyton を使用してオンザフライで値を生成している場合は、次のことができます。
INSERT
単一のステートメントを含むバッファーを作成する
- 取引を開始する
- 一時テーブルを作成
INSERT
し、バッファでステートメントを実行します
- 実行する
UPDATE ... FROM
- トランザクションをコミットし、一時テーブルを破棄します。
ステートメントは次のUPDATE
ようになります (new_values
更新する必要がある新しい値を含むテーブルがあると仮定します)。
UPDATE app_post AS a SET text_location = n.text_location
FROM new_values AS n WHERE a.id = n.id
id
列をPRIMARY KEYとして定義するか、列にインデックスを作成することを忘れないでください。
編集:パフォーマンスが非常に遅いため、別の回避策として、テーブル全体を再作成することができます。次のアイデアは、最初の投稿で示したように、テーブルにFOREIGN KEY
適用される制約がないことを前提としています。app_post
-- Begin the Transaction
BEGIN;
-- Create a temporary table to hold the new values
CREATE TEMPORARY TABLE temp_update_values (
id integer PRIMARY KEY,
text_location integer
) ON COMMIT DROP;
-- Populate it
INSERT INTO temp_update_values (id, text_location) VALUES (1, 123), (2, 456) /* ... #5000 total */ ;
-- Create a temporary table merging the existing "app_post" and "temp_update_values"
CREATE TEMPORARY TABLE temp_new_app_post ON COMMIT DROP AS
SELECT a.id, COALESCE(n.text_location, a.text_location) AS text_location, a.title
FROM app_post AS a LEFT JOIN temp_update_values AS n ON a.id = n.id;
-- Empty the existing "app_post"
TRUNCATE TABLE app_post;
-- Repopulate "app_post" table
INSERT INTO app_post (id, text_location, title)
SELECT id, text_location, title FROM temp_new_app_post;
-- Commit the Transaction
COMMIT;
制約がある場合は、テーブルをFOREIGN KEY
TRUNCATING する前にそれらを削除しapp_post
、再作成された後にそれらを再作成して、それらを処理する必要があります。