2016-04-11 38 views
1

Kompozit türleri bir dizinin içinde güncellemenin kolay bir yolu var mı?Dizideki bileşik türünü güncelle

Şu anda (diğer alanları kesilmiş) Aşağıdaki tablo vardır:

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

Bütün order_items ait status güncellemek istiyorum. 1'dan büyük olduğunda, tüm status, + 1 güncelleştirilmelidir. Kolay olacağını dizi alanı olmadan bir tablo için

:

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

Ancak, aynı içinde bir dizi yapmak istiyorum.

cevap

1

Sorununuzun kökü ilişkisel tasarımdır. Normalleştirilmiş bir şema (1: n ilişkide ayrı bir tablo) dizi sütunundan çok daha temiz ve daha kolay indekslenebilir veya güncellenebilir vs. Diskte daha fazla yer kaplaması zorlaşır, dizi ek yükü satır başı yüküne benzer.

talihsiz tasarımı ile sıkışmış iken, her adımda şeyleri kırmak vermemeye özen, dizi, güncelleme içi çelikten kurtar ve geri toplamak zorunda:

Bütün order_items ait status güncellemek istiyorum. 1'dan büyük olduğunda, tüm status, + 1 güncelleştirilmelidir. elementlerin

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; 

Sipariş olasılıkla değiştirmek değil , ama hiçbir garanti ORDER BY olmadan vardır. elementlerin
garanti için orijinal düzeni:

+0

aslında tablo yol yol büyüktür ve sadece bir göçün yol açtığı Durumu güncellemek gerekir. :( –

+1

@ChristianSchmitt: Öğelerin sırasına eklenen notu düşünün. –