2016-04-11 1 views
1

Existe-t-il un moyen facile de mettre à jour les types composites dans un tableau?Mettre à jour le type composite dans le tableau

Actuellement, j'ai le tableau suivant (I tronqués d'autres domaines):

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

Je veux mettre à jour le status de tous order_items. Quand il est supérieur à 1, tous les status doivent être mis à jour + 1.

Pour une table sans champ de tableau, il serait facile:

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

Cependant, je veux faire la même chose à l'intérieur un tableau.

Répondre

1

La racine de votre problème est la conception relationnelle. Un schéma normalisé (table séparée dans une relation 1: n) serait beaucoup plus propre que la colonne de tableau, et plus facile à indexer ou à mettre à jour etc. N'occuperait pas plus d'espace sur le disque non plus.

Bien que coincé avec votre conception malheureuse, vous devez unnest le tableau, mettre à jour et regrouper en arrière, en prenant soin de ne pas casser les choses à chaque étape:

Je veux mettre à jour le status de tous order_items. Quand il est supérieur à 1, tous les status doivent être mis à jour + 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; 

Ordre des éléments est susceptible ne pas changer, mais il n'y a aucune garantie sans ORDER BY.
Pour garantie commande initiale d'éléments:

+0

fait la table est une façon beaucoup plus grand et j'ai besoin que de mettre à jour l'état causé par une migration. :( –

+1

@ChristianSchmitt: Considérez la note ajoutée sur l'ordre des éléments. –