2016-04-11 8 views
1

配列内のコンポジットタイプを簡単に更新する方法はありますか?コンポジットタイプを配列内で更新する

現在、私は(私は他のフィールドを切り捨て)次の表があります。

CREATE TYPE order_item AS (delivery_date DATE, status INT); 
CREATE TABLE demo (id SERIAL PRIMARY KEY, data order_item[]); 

は、私はすべてのorder_itemsstatusを更新したいです。 1より大きい場合、statusはすべて+ 1に更新する必要があります。配列フィールドのないテーブルの場合

それは簡単だろう:

UPDATE mytab SET complex_col.r = (complex_col).r + 1; 

しかし、私は同じ内部の配列をしたいです。

答えて

1

問題の根は関係設計です。正規化されたスキーマ(1:n関係の別表)は、配列列よりもはるかにクリーンで、索引や更新が容易です。

あなたの不幸なデザインにこだわっている間、あなたは、配列をネスト解除するア​​ップデートを持っているとバック集計、各ステップで物事を壊さないように注意しながら:

私はすべてのorder_itemsstatusを更新したいです。 1より大きい場合、statusはすべて+ 1に更新する必要があります。要素の

UPDATE demo d 
SET data = x.data 
FROM (
    SELECT d.id, array_agg((o.delivery_date 
         , CASE WHEN o.status > 1 THEN o.status + 1 ELSE o.status END 
          )::order_item) AS data 
    FROM demo d 
    LEFT JOIN LATERAL unnest(data) o ON true 
    GROUP BY d.id 
    HAVING count(*) FILTER (WHERE o.status > 1) > 0 
    ) x 
WHERE d.id = x.id; 

注文はそう変更するにはありませんが、保証はORDER BYなしではありません。要素の
することを保証し元の順序:

+0

は、実際の表は、道道大きいと私は唯一のマイグレーションによるステータスを更新する必要があります。 :( –

+1

@ChristianSchmitt:要素の順序についての補足を考えてみましょう。 –

関連する問題