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

问题描述 投票:2回答:1

我使用PostgreSQL 10.1和:

CREATE TABLE human
(
    id        ... NOT NULL,
    gender    ...,
    height    ...,
    weight    ...,
    eye       ...,
    hair      ...,
    ...
);

我有一个输入表单,我通过它插入数据。我希望以一种优雅而恰当的方式选择哪些列需要以该形式显示,例如weight ... DISPLAYED,eye ... NOT DISPLAYED,

  • 一种方法是将NULL与DISPLAYED对应(当NOT NULL然后显示它,或者当NULL然后不显示它)并使用information_schema(对应)让我不那么高兴:
  • 另一种方式是: CREATE TABLE human_column ( id ... NOT NULL, characteristic character varying(...), is_displayed boolean ); 其中characteristic数据是human表的列的名称。

有没有更好的方法将直接外来属性添加到表的列? (在51.7. pg_attribute中有一个名为attoptions的列。它会被使用吗?)

database postgresql database-design
1个回答
0
投票

为列定义“选项”以定义是否“显示”它们似乎有点开销。想象一下,你在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)
© www.soinside.com 2019 - 2024. All rights reserved.