ホームページ > データベース > mysql チュートリアル > PostgreSQL の複数行更新で NULL 型キャストを処理する方法?

PostgreSQL の複数行更新で NULL 型キャストを処理する方法?

Linda Hamilton
リリース: 2025-01-03 04:06:42
オリジナル
410 人が閲覧しました

How to Handle NULL Type Casting in PostgreSQL Multi-Row Updates?

複数行更新での 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート