我有一个现有的表,其中包含一些不可为空的列:
CREATE table testtable( bkID serial NOT NulL,bklabel character varying(128),lacID integer NOT NulL}
我在这个表上创建了一个视图:
CREATE OR REPLACE VIEW test ASSELECT testtable.bkID,testtable.lacIDfrom public.testtable;
我很惊讶视图报告的information_schema.columns对于所选列是否可以为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.relnamefrom pg_attributeinner join pg_class on attrelID = oIDwhere relname = 'test'
回报:
attrelID;attname;attnotnull;relname271543;"bkID";f;"test"271543;"lacID";f;"test"
正如所料,attnotnull是’假’.
正如@ Mike-Sherrill-Catcall建议的那样,我可以手动将它们设置为true:
update pg_attributeset 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"
我将尝试导入Entity Framework数据模型中的视图.
编辑2:
正如猜测的那样,它可以工作,现在可以在实体框架数据模型中正确导入视图.
当然,我不会将所有列设置为不可为空,如上所示,只有那些在底层表中不可为空的列.
这里的information_schema底层的系统表中的列似乎是“attrnotnull”.我在pgsql-Hackers Listserv:cataloguing NOT NULL constraints中只看到一个引用“attnotnull”的线程.(但是该列可能在早期版本中有不同的名称.这可能值得研究.)
您可以使用此查询查看行为.您需要使用WHERE子句来准确获取您需要查看的内容.
select attrelID,pg_class.relnamefrom pg_attributeinner join pg_class on attrelID = oIDwhere attname like 'something%'
在我的系统上,具有主键约束的列和具有NOT NulL约束的列将“attnotnull”设置为“t”.视图中的相同列将“attnotnull”设置为“f”.
如果你倾斜你的头并且恰到好处地眯着眼睛,那就是有道理的.视图中的列未声明为NOT NulL.只是基表中的列.
列pg_attribute.attnotnull是可更新的.您可以将其设置为TRUE,并且该更改似乎会反映在information_schema视图中.虽然您可以直接将其设置为TRUE,但我认为我更愿意将其设置为与基表中的值匹配. (而且更舒服,我并不是说我在系统表中捣乱我都很舒服.)
总结以上是内存溢出为你收集整理的postgresql – 为什么我的视图列可以为空?全部内容,希望文章能够帮你解决postgresql – 为什么我的视图列可以为空?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)