Esiste un equivalente di SHOW CREATE TABLE di MySQL in Postgres?


66

C'è un equivalente di MySQL SHOW CREATE TABLEin Postgres? È possibile? In caso contrario, qual è la prossima soluzione migliore?

Ho bisogno dell'istruzione perché la uso per creare la tabella su un server remoto (su WCF).


E pensavo che MySQL fosse il database privo di tutte le funzioni interessanti ...
Christopher K.

Risposte:


27

Puoi provare a tracciare nel file di registro PostgreSQL cosa fa realmente "pg_dump -t table -s". Quindi puoi usare lo stesso metodo per scrivere la tua funzione sql.


ok, ho rintracciato pg_dump. Ma non è stato così facile, perché ho dovuto scrivere la mia funzione in C # per scrivere l'istruzione create table. Ma è stato di grande aiuto, quindi grazie mille veeeeerrrryyyy. : D
vlebar,

Non c'è bisogno di andare a tutti quei problemi - secondo qui puoi usare l' -Eopzione per tracciare cosa sta succedendo in background quando esegui un psqlcomando - -E: will describe the underlaying queries of the \ commands (cool for learning!)- HTH!
Vérace,

40

pg_dump:

pg_dump -st tablename dbname

oppure usa gli strumenti della GUI di PostgreSQL (pgAdmin, phpPgAdmin, ecc.)


cercherò di spiegare il problema in modo più dettagliato. Ho bisogno dell'istruzione sql (selezione o stored procedure) perché eseguo il comando sql in C # (NpgsqlCommand). Quindi penso che pg_dump non sia la soluzione in questo caso. :(
vlebar il

1
Perchè no? --schema-onlyha questo preciso scopo: Mostra le istruzioni SQL per creare lo schema / tabella. Puoi in qualche modo inserire questo output nel tuo programma C #.
Sven

guarda le opinioni di information_schema: postgresql.org/docs/9.0/interactive/information-schema.html
alvosu

1
@SvenW: lo farei se avessi un set di tabelle noto. Il problema è che l'utente può, se lo desidera, sincronizzare qualsiasi tabella nel database selezionato e quindi creare la tabella selezionata su un server remoto dietro un servizio wcf. Posso farlo con mssql e ora voglio espandere il programma client su altri server sql (mysql, oracle, postgresql, ...) OK, posso fare pg_dump per una tabella che l'utente desidera sincronizzare, ma se lo è possibile farlo solo in plsql, voglio farlo in plsql
vlebar

1
Se esegui il dumping su .tar, prendi il restore.sqlfile dall'archivio. Ha tutte le istruzioni create.
Joseph Lust,

15

Nella riga di comando ( psql) è possibile eseguire: \d <table name>per elencare tutte le colonne, i loro tipi e indici.


5
Questo è utile, ma non risponde alla domanda.
Ryan Tuck,

4

Partendo dalla prima parte della risposta di @ CubicalSoft è possibile inserire la seguente funzione che dovrebbe funzionare per tabelle semplici (presuppone lo schema "pubblico" predefinito e omette vincoli, indici e tipi di dati definiti dall'utente ecc. Ecc.). La risposta di @RJS è l'unico modo per farlo correttamente al momento; questo è qualcosa che dovrebbe essere integrato in psql!

CREATE OR REPLACE FUNCTION show_create_table(table_name text, join_char text = E'\n' ) 
  RETURNS text AS 
$BODY$
SELECT 'CREATE TABLE ' || $1 || ' (' || $2 || '' || 
    string_agg(column_list.column_expr, ', ' || $2 || '') || 
    '' || $2 || ');'
FROM (
  SELECT '    ' || column_name || ' ' || data_type || 
       coalesce('(' || character_maximum_length || ')', '') || 
       case when is_nullable = 'YES' then '' else ' NOT NULL' end as column_expr
  FROM information_schema.columns
  WHERE table_schema = 'public' AND table_name = $1
  ORDER BY ordinal_position) column_list;
$BODY$
  LANGUAGE SQL STABLE;

Questa dovrebbe essere la risposta accettata
exebook

Grazie per questo!
franco

3

Mi rendo conto di essere un po 'in ritardo a questa festa, ma questo è stato il primo risultato della mia Ricerca Google, quindi ho pensato di rispondere con quello che mi è venuto in mente.

Puoi ottenere abbastanza lontano verso una soluzione con questa query per ottenere le colonne:

SELECT *
FROM information_schema.columns
WHERE table_schema = 'YOURSCHEMA' AND table_name = 'YOURTABLE'
ORDER BY ordinal_position;

E quindi questa query per gli indici più comuni:

SELECT c.oid, c.relname, a.attname, a.attnum, i.indisprimary, i.indisunique
FROM pg_index AS i, pg_class AS c, pg_attribute AS a
WHERE i.indexrelid = c.oid AND i.indexrelid = a.attrelid AND i.indrelid = 'YOURSCHEMA.YOURTABLE'::regclass
ORDER BY" => "c.oid, a.attnum

Quindi si tratta di costruire le stringhe di query nel formato corretto.


2

Come spiegato in https://serverfault.com/a/875414/333439 , con il \d <table>meta-comando in psqlè possibile mostrare la struttura della tabella nel database. Se si desidera visualizzare la query utilizzata nel meta-comando, è possibile utilizzare il comando psql -E. Come descritto nella manpage, l' -Einterruttore fa eco alle \dquery dei meta comandi. Quindi, è possibile avviare psql -E, è possibile visualizzare la struttura della tabella con \d <table>meta-comando e, in base al -Epassaggio, è possibile visualizzare la query generata per descrivere la struttura della tabella


0

In pgAdmin 4 , trova la tabella nella struttura a sinistra, ad esempio:

Servers
+ PostgreSQL 11
  + Databases
    + MYDATABASENAME
      + Schemas
        + public
          + Tables
            + MYTABLENAME  <-- click this tree element

Quando viene selezionata la tabella, aprire la scheda SQL sulla destra. Visualizza il CREATE TABLEper la tabella selezionata.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.