Чи є еквівалент MySQL SHOW CREATE TABLE в постгресах?


66

Чи є еквівалент MySQL SHOW CREATE TABLEв постгресах? Чи можливо це? Якщо ні, то наступне найкраще рішення?

Виписка мені потрібна, оскільки я використовую її для створення таблиці на віддаленому сервері (над WCF).


І я подумав, що в MySQL в базі даних відсутні всі цікаві функції ...
Крістофер К.

Відповіді:


27

Ви можете спробувати простежити в файлі журналу PostgreSQL, що насправді робить "pg_dump -t table -s". Тоді ви можете використовувати той же метод, щоб написати власну функцію sql.


Гаразд, я простежив pg_dump. Але це було не так просто, тому що мені довелося записати власну функцію в C #, щоб написати оператор створення таблиці. Але це була велика допомога, тож спасибі вам веееееррррйій. : D
vlebar

Не потрібно йти на всю цю проблему - згідно з цим ви можете використовувати -Eопцію для відстеження того, що відбувається на задньому плані при запуску psqlкоманди - -E: will describe the underlaying queries of the \ commands (cool for learning!)- HTH!
Vérace

40

pg_dump:

pg_dump -st tablename dbname

або використовувати інструменти графічного інтерфейсу PostgreSQL (pgAdmin, phpPgAdmin тощо)


Я спробую пояснити проблему більш докладно. Мені потрібен оператор sql (вибір або збережена процедура), оскільки я виконую команду sql в C # (NpgsqlCommand). Тому я думаю, що в цьому випадку pg_dump не є рішенням. :(
vlebar

1
Чому ні? --schema-onlyмає саме таку мету: Показати оператори SQL для створення схеми / таблиці. Ви можете якось подати цей вихід у свою програму C #.
Свен

дивіться перегляди інформації_шами: postgresql.org/docs/9.0/interactive/information-schema.html
alvosu

1
@SvenW: Я би зробив це, якби у мене був відомий набір таблиць. Проблема полягає в тому, що користувач може, якщо вирішить синхронізувати будь-яку таблицю у вибраній базі даних, а потім створити вибрану таблицю на віддаленому сервері за службою wcf. Я можу це зробити з mssql, і тепер я хочу розширити клієнтську програму на інші сервери sql (mysql, oracle, postgresql, ...) Добре, я можу зробити pg_dump для таблиці, яку користувач хоче синхронізувати, але якщо це взагалі можливо це зробити просто в plsql, я хочу це зробити в plsql
vlebar

1
Якщо ви демпінгуєте .tar, візьміть restore.sqlфайл з архіву. У ньому є всі заяви про створення.
Йосип Похоть


4

Спираючись на першу частину відповіді @ CubicalSoft, ви можете скористатися наступною функцією, яка повинна працювати для простих таблиць (передбачає "загальнодоступну" схему "за замовчуванням" і не містить обмежень, індексів та визначених користувачем типів даних тощо тощо). @RJS відповідь - єдиний спосіб зробити це належним чином на даний момент; це те, що має бути вбудовано в 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;

Це має бути прийнята відповідь
exebook

Дякую за це!
відвертий

3

Я розумію, що я трохи запізнююся на цю вечірку, але це був перший результат мого пошуку в Google, тому я зрозумів, що відповім, що придумав.

З цим запитом можна отримати досить далеко до рішення, щоб отримати стовпці:

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

І тоді цей запит для найбільш поширених індексів:

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

Тоді мова йде про створення рядків (запитів) у потрібному форматі.


2

Як відповіли в https://serverfault.com/a/875414/333439 , за допомогою \d <table>мета-команди psqlможна показати структуру таблиці в базі даних. Якщо ви хочете переглянути запит, який використовується в метакоманді, ви можете використовувати команду psql -E. Як описано на сторінці, -Eперемикач повторює \dзапити метакоманд. Отже, ви можете запустити psql -E, ви можете переглянути структуру таблиці за допомогою \d <table>метакоманди, і, відповідно до -Eперемикача, ви можете переглянути запит, сформований для опису структури таблиці


0

У pgAdmin 4 просто знайдіть таблицю на дереві зліва, наприклад:

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

Коли таблиця обрана, відкрийте вкладку SQL праворуч. Він відображає позначення CREATE TABLEдля вибраної таблиці.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.