为什么我的视图列可以为空?

Oli*_*ROT 6 postgresql view entity-framework-5

我在Windows上运行PostgreSQL 9.2.

我有一个现有的表,其中包含一些不可为空的列:

CREATE TABLE testtable
(
  bkid serial NOT NULL,
  bklabel character varying(128),
  lacid integer NOT NULL
}
Run Code Online (Sandbox Code Playgroud)

我在这个表上创建了一个视图:

CREATE OR REPLACE VIEW test AS
SELECT testtable.bkid, testtable.lacid
from public.testtable;
Run Code Online (Sandbox Code Playgroud)

我很惊讶视图报告的information_schema.columns对于所选列是否可以为YES?

select * from information_schema.columns where table_name = 'test'
Run Code Online (Sandbox Code Playgroud)

报告:

"MyDatabase";"public";"test";"bkid";1;"";"YES";"integer";;;32;2;0;;"";;"";"";"";"";"";"";"";"";"";"MyDatabase";"pg_catalog";"int4";"";"";"";;"1";"NO";"NO";"";"";"";"";"";"";"NEVER";"";"NO"
"MyDatabase";"public";"test";"lacid";2;"";"YES";"integer";;;32;2;0;;"";;"";"";"";"";"";"";"";"";"";"MyDatabase";"pg_catalog";"int4";"";"";"";;"2";"NO";"NO";"";"";"";"";"";"";"NEVER";"";"NO"
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗?

我的问题是我正在尝试在实体框架数据模型中导入此类视图,但它失败了,因为所有列都标记为可为空.

编辑1:

以下查询:

select attrelid, attname, attnotnull, pg_class.relname
from pg_attribute
inner join pg_class on attrelid = oid
where relname = 'test'
Run Code Online (Sandbox Code Playgroud)

回报:

attrelid;attname;attnotnull;relname
271543;"bkid";f;"test"
271543;"lacid";f;"test"
Run Code Online (Sandbox Code Playgroud)

正如所料,attnotnull是'假'.

正如@ Mike-Sherrill-Catcall建议的那样,我可以手动将它们设置为true:

update pg_attribute
set attnotnull = 't'
where attrelid = 271543
Run Code Online (Sandbox Code Playgroud)

并且更改反映在information_schema.columns中:

select * from information_schema.columns where table_name = 'test'
Run Code Online (Sandbox Code Playgroud)

输出是:

"MyDatabase";"public";"test";"bkid";1;"";"NO";"integer";;;32;2;0;;"";;"";"";"";"";"";"";"";"";"";"MyDatabase";"pg_catalog";"int4";"";"";"";;"1";"NO";"NO";"";"";"";"";"";"";"NEVER";"";"NO"
"MyDatabase";"public";"test";"lacid";2;"";"NO";"integer";;;32;2;0;;"";;"";"";"";"";"";"";"";"";"";"MyDatabase";"pg_catalog";"int4";"";"";"";;"2";"NO";"NO";"";"";"";"";"";"";"NEVER";"";"NO"
Run Code Online (Sandbox Code Playgroud)

我将尝试导入Entity Framework数据模型中的视图.

编辑2:

正如猜测的那样,它可以工作,现在可以在实体框架数据模型中正确导入视图.当然,我不会将所有列设置为不可为空,如上所示,只有那些在底层表中不可为空的列.

Mik*_*ll' 7

我相信这是预期的行为,但我并不假装完全理解它。基表中的列似乎具有正确的属性。

此处作为information_schema 基础的系统表中的列似乎是“attrnotnull”。我在 pgsql-hackers listserv 上只看到一个线程提到“attnotnull”:编目 NOT NULL 约束。(但该列在早期版本中可能有不同的名称。这可能值得研究。)

您可以通过此查询查看行为。您需要使用 WHERE 子句来准确获取您需要查看的内容。

select attrelid, attname, attnotnull, pg_class.relname
from pg_attribute
inner join pg_class on attrelid = oid
where attname like 'something%'
Run Code Online (Sandbox Code Playgroud)

在我的系统上,具有主键约束的列和具有 NOT NULL 约束的列将“attnotnull”设置为“t”。视图中的相同列将“attnotnull”设置为“f”。

如果你倾斜你的头,眯着眼睛恰到好处,即一种是有道理的。视图中的列未声明为 NOT NULL。只是基表中的列。

列 pg_attribute.attnotnull 是可更新的。您可以将其设置为 TRUE,该更改似乎反映在 information_schema 视图中。尽管您可以直接将其设置为 TRUE,但我认为将其设置为与基表中的值相匹配会更舒服。(更舒适,我并不是暗示我对在系统表中乱搞很舒服。)