我使用PostgreSQL 10.1和:
CREATE TABLE human
(
id ... NOT NULL,
gender ...,
height ...,
weight ...,
eye ...,
hair ...,
...
);
我有一个输入表单,通过它我插入数据。我希望有一种优雅而恰当的方式,我可以选择哪个列需要显示,如weight ... DISPLAYED,
或eye ... NOT DISPLAYED,
。
一种方法是将 NULL 与 DISPLAYED 对应(当NOT NULL然后显示它,或者当NULL不显示它时)并使用{{1哪个(相应的)让我不高兴:
另一种方法是:
information_schema
其中CREATE TABLE human_column
(
id ... NOT NULL,
characteristic character varying(...),
is_displayed boolean
);
数据是characteristic
表的列的名称。
有没有更好的方法将直接外来属性添加到表的列? (在human
中有一个名为51.7. pg_attribute
的列。是否会使用它?)
答案 0 :(得分:0)
为列定义“选项”以定义它们是否“显示”或不显示它们似乎有点开销。想象一下,您将此列表保留在human_column
中。要修改它,您需要使用新的is_displayed
值更新它。然后,您需要构建要在查询中选择的列列表。
创建视图时,您也会这样做(指定要显示的列的列表),然后您只需查询视图,而无需动态构建查询。您也可以随时查看目录或information_schema中包含的列的当前列表。
视图中唯一的“不舒适”功能 - 您无法更改其中的列,因此您必须再次删除并创建它。
按需删除/创建视图对我来说更便宜然后动态构建查询,每个选择上的列列表仍然。
演示:
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)