如何标记表的选定列以供显示

时间:2017-12-29 21:11:31

标签: database postgresql database-design

我使用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的列。是否会使用它?)

1 个答案:

答案 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)