我在 Windows 上运行 PostgreSQL 9.2。
我有一个包含一些不可为空列的现有表:
CREATE TABLE testtable
(
bkid serial NOT NULL,
bklabel character varying(128),
lacid integer NOT NULL
}
我在此表上创建了一个视图:
CREATE OR REPLACE VIEW test AS
SELECT testtable.bkid, testtable.lacid
from public.testtable;
我很惊讶视图报告的 information_schema.columns is_nullable 对于所选列是否为 YES ?
select * from information_schema.columns where table_name = 'test'
报告:
"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"
这是预期的行为吗?
我的问题是我试图在实体框架数据模型中导入此类视图,但它失败了,因为所有列都标记为可为空。
编辑 1:
以下查询:
select attrelid, attname, attnotnull, pg_class.relname
from pg_attribute
inner join pg_class on attrelid = oid
where relname = 'test'
返回:
attrelid;attname;attnotnull;relname
271543;"bkid";f;"test"
271543;"lacid";f;"test"
正如预期的那样,attnotnull 为“假”。
正如@Mike-Sherrill-Catcall 建议的那样,我可以手动将它们设置为 true :
update pg_attribute
set attnotnull = 't'
where attrelid = 271543
并且更改反映在 information_schema.columns 中:
select * from information_schema.columns where table_name = 'test'
输出是:
"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"
我将尝试在实体框架数据模型中导入视图。
编辑 2:
正如猜测的那样,它可以工作,视图现在已正确导入到实体框架数据模型中。当然,我不会将所有列都设置为不可为空,如上所示,只有基础表中的那些不可为空。