如何在创建实体化视图时指示列不可为空?

时间:2017-11-11 19:59:07

标签: postgresql materialized-views

我正在使用以下查询创建物化视图:

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列不可为空。

希望将published_at列表示为不可空的原因是因为我使用scaffolding tool生成基于数据库模式的数据库查询和类型。在这种特殊情况下,published_at被错误地表示为可以触发严格类型检查错误的可空列。

所述脚手架工具使用以下查询来描述数据库:

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')

1 个答案:

答案 0 :(得分:3)

语法在今天的CREATE或ALTER表单中不支持它。我猜,但由于CREATE MATERIALIZED VIEW语句接受任何查询,因此无法从引用的表中可靠地复制非空约束。

但是,您可以更新pg_catalog.pg_attribute本身以执行您想要的操作。

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