Czy w postgresie jest odpowiednik MySQL dla SHOW CREATE TABLE?

66

Czy SHOW CREATE TABLEw postgresie jest odpowiednik MySQL ? czy to możliwe? Jeśli nie, jakie jest następne najlepsze rozwiązanie?

Potrzebuję instrukcji, ponieważ używam jej do tworzenia tabeli na zdalnym serwerze (przez WCF).

Vlebar
źródło
I myślałem, że MySQL nie zawiera wszystkich fajnych funkcji ...
Christopher K.

Odpowiedzi:

27

Możesz spróbować prześledzić w pliku dziennika PostgreSQL, co tak naprawdę robi „pg_dump -t table -s”. Następnie możesz użyć tej samej metody do napisania własnej funkcji SQL.

RJS
źródło
ok, prześledziłem pg_dump. Ale to nie było tak łatwe, ponieważ musiałem napisać własną funkcję w C #, aby napisać instrukcję create table. Ale to była wielka pomoc, więc dziękuję bardzo. : D
vlebar
Nie musisz męczyć się z tymi wszystkimi problemami - zgodnie z tym możesz użyć -Eopcji śledzenia tego, co dzieje się w tle po uruchomieniu psqlpolecenia - -E: will describe the underlaying queries of the \ commands (cool for learning!)- HTH!
Vérace
40

pg_dump:

pg_dump -st tablename dbname

lub użyj narzędzi GUI PostgreSQL (pgAdmin, phpPgAdmin itp.)

alvosu
źródło
postaram się wyjaśnić problem bardziej szczegółowo. Potrzebuję instrukcji sql (wybierz lub procedura przechowywana), ponieważ wykonuję polecenie sql w C # (NpgsqlCommand). Myślę więc, że pg_dump nie jest rozwiązaniem w tym przypadku. :(
vlebar
1
Dlaczego nie? --schema-onlyma dokładnie ten cel: Pokaż instrukcje SQL, aby utworzyć schemat / tabelę. Możesz w jakiś sposób wprowadzić to wyjście do swojego programu C #.
Sven
spójrz na widoki information_schema: postgresql.org/docs/9.0/interactive/information-schema.html
alvosu
1
@ SvvenW: Zrobiłbym to, gdybym miał znany zestaw tabel. Problem polega na tym, że użytkownik może, jeśli zechce, zsynchronizować dowolną tabelę w wybranej bazie danych, a następnie utworzyć wybraną tabelę na zdalnym serwerze za usługą wcf. Mogę to zrobić za pomocą mssql, a teraz chcę rozszerzyć program klienta na inne serwery sql (mysql, oracle, postgresql, ...) OK, mogę zrobić pg_dump dla tabeli, którą użytkownik chce zsynchronizować, ale jeśli jest w ogóle możliwe, aby to zrobić tylko w plsql, chcę to zrobić w plsql
vlebar
1
Jeśli zrzut do .tar, pobierz restore.sqlplik z archiwum. Zawiera wszystkie instrukcje tworzenia.
Joseph Lust
15

W linii poleceń ( psql) możesz uruchomić: \d <table name>aby wyświetlić wszystkie kolumny, ich typy i indeksy.

Łukasz Czerwiński
źródło
5
Jest to pomocne, ale nie odpowiada na pytanie.
Ryan Tuck
4

Opierając się na pierwszej części odpowiedzi @ CubicalSoft, możesz dodać następującą funkcję, która powinna działać w przypadku prostych tabel (zakłada domyślny „publiczny” schemat i pomija ograniczenia, indeksy i typy danych zdefiniowane przez użytkownika itp.). Odpowiedź @RJS jest w tej chwili jedynym sposobem, aby zrobić to właściwie; jest to coś, co powinno być wbudowane w 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;
Eoghan
źródło
To powinna być zaakceptowana odpowiedź
exebook
Dziękuję Ci za to!
szczery
3

Zdaję sobie sprawę, że jestem trochę spóźniony na tę imprezę, ale był to pierwszy wynik mojej wyszukiwarki Google, więc pomyślałem, że odpowiem na to, co wymyśliłem.

Za pomocą tego zapytania możesz dotrzeć dość daleko w kierunku rozwiązania, aby uzyskać kolumny:

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

A potem zapytanie dla najpopularniejszych indeksów:

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

Następnie należy zbudować ciąg zapytania w odpowiednim formacie.

CubicleSoft
źródło
2

Zgodnie z odpowiedzią w https://serverfault.com/a/875414/333439 , przy użyciu \d <table>meta-polecenia psqlmożna wyświetlić strukturę tabeli w bazie danych. Jeśli chcesz wyświetlić zapytanie użyte w meta-poleceniu, możesz użyć polecenia psql -E. Jak opisano na stronie podręcznika, -Eprzełącznik powtarza \dzapytania meta-komend. Więc możesz uruchomić psql -E, możesz wyświetlić strukturę tabeli za pomocą \d <table>meta-polecenia, i, zgodnie z -Eprzełącznikiem, możesz wyświetlić wygenerowane zapytanie opisujące strukturę tabeli

Enrico Bianchi
źródło
0

W pgAdmin 4 po prostu znajdź tabelę w drzewie po lewej stronie, np .:

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

Po wybraniu tabeli otwórz kartę SQL po prawej stronie. Wyświetla CREATE TABLEwybraną tabelę.

Christopher K.
źródło