Есть ли эквивалент 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
для выбранной таблицы.