2017-11-11 7 views
1

나는 다음과 같은 쿼리를 사용하여 구체화 된 뷰를 만드는 오전 :구체화 된보기를 만들 때 열이 nullable이 아님을 나타내는 방법은 무엇입니까?

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 열을 Nullable로 표시하려는 이유는 데이터베이스 스키마를 기반으로 데이터베이스 쿼리와 형식을 생성하는 scaffolding tool을 사용하기 때문입니다. 이 특별한 경우에는 published_at이 엄격한 유형 검사 오류를 유발하는 Nullable 열로 잘못 표시되고 있습니다.

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

구문은에 CREATE 또는 오늘날의 약자로 형태를 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