Gaj*_*jus 5 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);
Run Code Online (Sandbox Code Playgroud)
我希望它在实体化视图中表示该published_at列不可为空。
想要将published_at列表示为不可为空的原因是因为我使用了一个脚手架工具,它根据数据库模式生成数据库查询和类型。在这种特殊情况下,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')
Run Code Online (Sandbox Code Playgroud)
目前的语法不支持 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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1355 次 |
| 最近记录: |