複数行更新での NULL 型のキャスト
PostgreSQL では、複数の行に対して更新クエリを実行すると、NULL を処理するときにエラーが発生する可能性があります列の型が明示的にキャストされていない場合の値。この記事では、この問題に対するいくつかの解決策を検討し、複数行の更新中に適切な型キャストを確保するための代替アプローチを提供します。
解決策 1: VALUES および UNION ALL で Limit 0 を選択します
UPDATE foo f SET x = t.x , y = t.y FROM ( (SELECT pkid, x, y FROM foo LIMIT 0) -- Get column types UNION ALL VALUES (1, 20, NULL) -- No type casts , (2, 50, NULL) ) t -- Column names and types defined WHERE f.pkid = t.pkid;
このメソッドは、LIMIT 0 を指定した SELECT ステートメントを組み合わせて列名と型を取得し、必要なデータ行を追加します。 UNION ALL 演算子を使用します。サブクエリの最初の行により、後続の行に適切な列タイプが定義されるようになります。
解決策 2: VALUES および UNION ALL SELECT で Limit 0 を選択します
UPDATE foo f SET x = t.x , y = t.y FROM ( (SELECT pkid, x, y FROM foo LIMIT 0) -- Get column types UNION ALL SELECT 1, 20, NULL UNION ALL SELECT 2, 50, NULL ) t -- Column names and types defined WHERE f.pkid = t.pkid;
解決策 1 と同様に、このアプローチでは SELECT を使用して列の型を取得し、個別の SELECT ステートメントを使用してデータを追加します
解決策 3: 列ごとの型を使用した VALUES 式
UPDATE foo f SET x = t.x , y = t.y FROM ( VALUES ((SELECT pkid FROM foo LIMIT 0) , (SELECT x FROM foo LIMIT 0) , (SELECT y FROM foo LIMIT 0)) -- Get type for each col individually , (1, 20, NULL) , (2, 50, NULL) ) t (pkid, x, y) -- Columns names not defined yet, only types. ...
この解決策は、VALUES 式自体の中で列の型を定義します。 、自動型によるエラーが発生することなく、後続の行がそれらの型にキャストされるようにします。
解決策 4: 行型を使用した VALUES 式
UPDATE foo f SET x = (t.r).x -- Parenthesis for unambiguous syntax , y = (t.r).y FROM ( VALUES ('(1,20,)'::foo) -- Columns need to be in table default order ,('(2,50,)') -- Nothing after last comma for NULL ) t (r) -- Column name for row type WHERE f.pkid = (t.r).pkid;
このアプローチでは、特定のテーブルの行型を使用して、列を正しい値にキャストできます。暗黙的に型を指定します。フィールド選択構文を使用して、個々の列の値にアクセスできます。
解決策 5: 分割された行タイプを使用した VALUES 式
UPDATE foo f SET x = t.x , y = t.y FROM ( VALUES (('(1,20,)'::foo).*) -- Decomposed row of values , (2, 50, NULL) ) t(pkid, x, y) -- Arbitrary column names (match table columns) WHERE f.pkid = t.pkid; -- Eliminates 1st row with NULL values
解決策 4 と似ていますが、分割された行を使用します。データ値を指定します。これにより、関連する列のみを指定できるため、テーブル内のすべての列の完全な順序と型を知る必要がなくなります。
最適なソリューションの選択は、パフォーマンス、利便性、可用性などの要素によって異なります。列の型に関する情報。
以上がPostgreSQL の複数行更新で NULL 型キャストを処理する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。