Есть ли эквивалент в MySQL SHOW CREATE TABLE в Postgres?


66

Есть ли эквивалент в MySQL SHOW CREATE TABLEв Postgres? Это возможно? Если нет, каково следующее лучшее решение?

Мне нужно утверждение, потому что я использую его для создания таблицы на удаленном сервере (через WCF).


И я думал, что MySQL - это база данных, в которой отсутствуют все интересные функции ...
Кристофер К.

Ответы:


27

Вы можете попытаться отследить в файле журнала PostgreSQL, что действительно делает pg_dump -t table -s. Затем вы можете использовать тот же метод для написания своей собственной функции sql.


хорошо, я проследил pg_dump. Но это было не так просто, потому что мне пришлось написать свою собственную функцию на C #, чтобы написать оператор создания таблицы. Но это было большим подспорьем, поэтому большое спасибо. : D
Влебар

Нет необходимости идти на все эти проблемы - согласно здесь вы можете использовать -Eопцию , чтобы проследить , что происходит в фоновом режиме , когда вы запускаете psqlкоманду - -E: will describe the underlaying queries of the \ commands (cool for learning!)- HTH!
Вера

40

pg_dump:

pg_dump -st tablename dbname

или используйте PostgreSQL GUI Tools (pgAdmin, phpPgAdmin и т. д.)


Я постараюсь объяснить проблему более подробно. Мне нужна инструкция sql (выберите или хранимая процедура), потому что я выполняю команду sql в C # (NpgsqlCommand). Поэтому я думаю, что pg_dump не является решением в этом случае. :(
Влебар

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

Посмотрите на представления information_schema: 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. Как описано в man-странице, -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.