2017-11-11 1 views
1

私は、次のクエリを使用してマテリアライズド・ビューを作成しています:マテリアライズド・ビューの作成時に列がNULL可能ではないことを示す方法はありますか?

CREATE MATERIALIZED VIEW article_view AS 
SELECT 
    id, 
    alternative_headline, 
    article_author_id, 
    created_at, 
    description, 
    headline, 
    preview_paragraph_image_id, 
    published_at, 
    updated_at 
FROM article 
WHERE 
    published_at IS NOT NULL 
WITH NO DATA; 

CREATE UNIQUE INDEX ON article_view (id); 

は、私はpublished_at列がNULL可能ではないことで表現することにしたいです。

published_at列をヌル可能でないと表現したい理由は、データベースのスキーマに基づいてデータベースクエリと型を生成するscaffolding toolを使用しているためです。この特定のケースでは、published_atが厳密な型チェックエラーを引き起こすNULL可能な列として誤って表現されています。

ザ・は足場ツールは、データベースを記述するために、次のクエリを使用していると述べた。

SELECT 
    pc1.relname AS "tableName", 
    pa1.attname AS "columnName", 
    pg_catalog.format_type (pa1.atttypid, NULL) "dataType", 
    pc1.relkind = 'm' "isMaterializedView", 
    NOT(pa1.attnotnull) "isNullable" 
FROM 
    pg_class pc1 
JOIN pg_namespace pn1 ON pn1.oid = pc1.relnamespace 
JOIN 
    pg_attribute pa1 ON pa1.attrelid = pc1.oid 
    AND pa1.attnum > 0 
    AND NOT pa1.attisdropped 
WHERE 
    pn1.nspname = 'public' AND 
    pc1.relkind IN ('r', 'm') 
+0

あなたのPostgresバージョンは何ですか? – klin

+0

PostgreSQLバージョン9.6 – Gajus

+0

おそらく良い考えは、mview属性ではなく元のテーブルnullableをチェックするでしょうか?私はスキャフォールディングツールを指しています - あなたはポストグルロジックと同期していて、ツールの制約条件をサポートしています。 –

答えて

2

構文はそれが今日立っているとして、それが中にフォームを作成するか、ALTERサポートしていません。私は推測していますが、CREATE MATERIALIZED VIEWステートメントはすべての照会を受け入れるため、参照されていない表から確実に非NULL制約をコピーすることはできません。

ただし、pg_catalog.pg_attribute自体を更新して、必要な処理を行うことができます。

UPDATE pg_catalog.pg_attribute 
SET attnotnull = true 
WHERE attrelid = the_oid_of_the_published_at_column; 
+0

ありがとう。私は 'ALTER TABLE'に関するあなたの提案が好きです。他の人の参考資料:https://www.postgresql.org/message-id/20171112031621.31521.10140%40wrigleys.postgresql.org – Gajus

関連する問題