2017-12-29 43 views
2

ich PostgreSQL 10.1 und:Wie ausgewählten Spalten einer Tabelle für die Anzeige markieren

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

Ich habe eine Eingabemaske, durch die ich die Daten einfügen. Ich wünsche eine elegante und richtige Art und Weise, mit der ich SELECT welche Spalten erforderlich sein, um DISPLAYED in dieser Form, so etwas wie oder eye ... NOT DISPLAYED,.

  • Eine Möglichkeit ist NULL mit ANGEZEIGT (wenn NOT NULL dann angezeigt oder, wenn NULL dann nicht angezeigt) entsprechen und information_schema verwenden, die (entsprechende) macht nicht mich so glücklich:

  • Eine andere Möglichkeit ist:

    CREATE TABLE human_column 
    (
        id    ... NOT NULL, 
        characteristic character varying(...), 
        is_displayed  boolean 
    ); 
    

    wo characteristic Daten die Namen der Spalten vonsind 10 Tabelle.

Gibt es einen besseren Weg, um ein direktes ausländisches Attribut auf die Spalten einer Tabelle hinzufügen? (In 51.7. pg_attribute gibt es eine Spalte mit dem Namen attoptions. Würde es verwendet werden?)

+1

Sie sollten nicht aktualisieren 'pg_attribute' sicher. und Sie können benutzerdefinierte "Attribute" zu einer Spalte hinzufügen - also nur eine Liste irgendwo gespeichert haben. Sie müssen jedoch dynamisch eine Ansicht oder Ähnliches erstellen und dann eine Fahndungsliste zurückgeben. Wenn die Liste nicht änderbar ist - erstellen Sie einfach eine Ansicht? .. –

+0

können Sie Ihre eigene "Sprache" und verwenden Sie die pro Spalte Kommentar für Anmerkungen. Etwas spröde, obwohl – pbuck

+0

Ich denke, dass dies nicht verwandt ist zu persistence layer (database) Ihrer Anwendung, eher zu Ihrem Server. – gokcand

Antwort

0

Angabe "Optionen" für Spalten zu definieren, ob sie "angezeigt" werden oder nicht scheint ein wenig Overhead. Stellen Sie sich vor, Sie behalten diese Liste in human_column. Um es zu ändern, müssten Sie es mit neuen Werten is_displayed aktualisieren. Dann müssten Sie die Spaltenliste erstellen, die in der Abfrage ausgewählt werden soll.

Wenn Sie eine Ansicht zu erstellen, führen Sie die gleiche (eine Liste der Spalten angeben angezeigt werden) und dann können Sie nur die Ansicht abfragen, ohne die Notwendigkeit, dynamisch die Abfrage zu erstellen. Sie können auch jederzeit die aktuelle Liste der enthaltenen Spalten aus dem Katalog oder information_schema überprüfen.

Das einzige „nicht gemütlich“ Merkmal einer Ansicht - Sie können keine Spalten darin ändern, so müssen Sie es wieder fallen zu lassen und erstellen.

Drop/create view on Demand sieht mir billiger dann auf jeder dynamisch Aufbau Abfrage mit der Liste der Spalten noch aus.

Demo:

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) 

Überprüfung Liste der Spalten:

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) 

gleiche gilt für Original-Tabelle:

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) 
Verwandte Themen