Назад | Перейти на главную страницу

Есть ли в Postgres аналог MySQL SHOW CREATE TABLE?

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

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

pg_dump:

pg_dump -st tablename dbname

или используйте инструменты графического интерфейса PostgreSQL (pgAdmin, phpPgAdmin и т. д.)

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

В командной строке (psql) Вы можете запустить: \d <table name> чтобы перечислить все столбцы, их типы и индексы.

Основываясь на первой части ответа @ 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;

Я понимаю, что немного опоздал на эту вечеринку, но это был первый результат моего поиска в 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

Затем нужно создать строку (строки) запроса в правильном формате.

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

Расширение Postgres ddlx (https://github.com/lacanoid/pgddl) делает именно это и многое другое.

В pgAdmin 4, просто найдите таблицу в дереве слева, например:

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

Когда таблица выбрана, откройте Вкладка SQL справа. Он отображает CREATE TABLE для выбранной таблицы.