我在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"
它是一個預期的行爲?
我的問題是,我試圖在實體框架數據模型中導入這樣的視圖,並且它失敗,因爲所有列都標記爲可爲空。
EDIT 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是 '假'。
正如@麥克 - 謝里爾 - 噓聲建議,我可以手動將其設置爲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:
由於猜到了,它的工作原理,該視圖現在可以正確導入實體框架數據模型。 當然,我不會將所有列設置爲非空,如上所示,只有那些不可空的在基礎表中。
對@ mike-sherrill-catcall的好評:查看我的編輯,我將其設置爲true以進行測試,效果很好。現在我必須創建一個腳本來根據基表中的值來設置它。 –