我使用PostgreSQL 10.1和:
CREATE TABLE human
(
id ... NOT NULL,
gender ...,
height ...,
weight ...,
eye ...,
hair ...,
...
);
我有一个输入表单,我通过它插入数据。我希望以一种优雅而恰当的方式选择哪些列需要以该形式显示,例如weight ... DISPLAYED,
或eye ... NOT DISPLAYED,
。
information_schema
(对应)让我不那么高兴:CREATE TABLE human_column
(
id ... NOT NULL,
characteristic character varying(...),
is_displayed boolean
);
其中characteristic
数据是human
表的列的名称。有没有更好的方法将直接外来属性添加到表的列? (在51.7. pg_attribute
中有一个名为attoptions
的列。它会被使用吗?)
为列定义“选项”以定义是否“显示”它们似乎有点开销。想象一下,你在human_column
保留这样的名单。要修改它,您需要使用新的is_displayed
值更新它。然后,您需要构建要在查询中选择的列列表。
创建视图时,您也会这样做(指定要显示的列的列表),然后您只需查询视图,而无需动态构建查询。您还可以随时从catalog或information_schema中检查所包含列的当前列表。
视图中唯一的“不舒适”功能 - 您无法更改其中的列,因此您必须再次删除并创建它。
drop / create view on demand对我来说看起来更便宜然后动态构建查询,每个select仍然有列列表。
演示:
db=# create view v as select oid,datname from pg_database;
CREATE VIEW
db=# select * from v;
oid | datname
-------+-----------
13505 | postgres
16384 | t
1 | template1
13504 | template0
16419 | o
(5 rows)
检查列列表:
db=# select column_name,ordinal_position,column_default,is_nullable,data_type,character_maximum_length from information_schema.columns where table_name = 'v';
column_name | ordinal_position | column_default | is_nullable | data_type | character_maximum_length
-------------+------------------+----------------+-------------+-----------+--------------------------
oid | 1 | | YES | oid |
datname | 2 | | YES | name |
(2 rows)
原始表格相同:
db=# select column_name,ordinal_position,column_default,is_nullable,data_type,character_maximum_length from information_schema.columns where table_name = 'pg_database';
column_name | ordinal_position | column_default | is_nullable | data_type | character_maximum_length
---------------+------------------+----------------+-------------+-----------+--------------------------
datname | 1 | | NO | name |
datdba | 2 | | NO | oid |
encoding | 3 | | NO | integer |
datcollate | 4 | | NO | name |
datctype | 5 | | NO | name |
datistemplate | 6 | | NO | boolean |
datallowconn | 7 | | NO | boolean |
datconnlimit | 8 | | NO | integer |
datlastsysoid | 9 | | NO | oid |
datfrozenxid | 10 | | NO | xid |
datminmxid | 11 | | NO | xid |
dattablespace | 12 | | NO | oid |
datacl | 13 | | YES | ARRAY |
(13 rows)