Apakah ada yang setara dengan SHOW CREATE TABLE MySQL di Postgres?


66

Apakah ada yang setara dengan MySQL SHOW CREATE TABLEdi Postgres? Apakah ini mungkin? Jika tidak, apa solusi terbaik berikutnya?

Saya perlu pernyataan karena saya menggunakannya untuk membuat tabel di server jauh (lebih dari WCF).


Dan saya pikir MySQL adalah database yang kehilangan semua fitur keren ...
Christopher K.

Jawaban:


27

Anda dapat mencoba melacak di file log PostgreSQL apa yang sebenarnya dilakukan oleh "pg_dump -t table -s". Kemudian Anda dapat menggunakan metode yang sama untuk menulis fungsi sql Anda sendiri.


ok, saya melacak pg_dump. Tapi itu tidak mudah, karena saya harus menulis fungsi saya sendiri di C # untuk menulis pernyataan membuat tabel. Tapi itu sangat membantu, jadi terima kasih banyak. : D
vlebar

Tidak perlu pergi ke semua masalah itu - menurut di sini Anda dapat menggunakan -Eopsi untuk melacak apa yang terjadi di latar belakang ketika Anda menjalankan psqlperintah - -E: will describe the underlaying queries of the \ commands (cool for learning!)- HTH!
Vérace

40

pg_dump:

pg_dump -st tablename dbname

atau gunakan Alat GUI PostgreSQL (pgAdmin, phpPgAdmin, dll.)


Saya akan mencoba menjelaskan masalahnya secara lebih rinci. Saya memerlukan pernyataan sql (pilih atau prosedur tersimpan) karena saya menjalankan perintah sql di C # (NpgsqlCommand). Jadi saya pikir pg_dump bukan solusi dalam hal ini. :(
vlebar

1
Kenapa tidak? --schema-onlymemiliki tujuan yang tepat ini: Tampilkan pernyataan SQL untuk membuat skema / tabel. Anda dapat memasukkan output ini ke dalam program C # Anda entah bagaimana.
Sven


1
@VenW: Saya akan melakukan itu jika saya memiliki seperangkat tabel yang dikenal. Masalahnya adalah bahwa pengguna dapat, jika ia memilih untuk, menyinkronkan tabel apa pun dalam database yang dipilih dan kemudian membuat tabel yang dipilih pada server jauh di belakang layanan wcf. Saya dapat melakukannya dengan mssql dan sekarang saya ingin memperluas program klien ke server sql lain (mysql, oracle, postgresql, ...) OK, saya bisa melakukan pg_dump untuk tabel yang ingin disinkronkan pengguna, tetapi jika ya sebisa mungkin untuk melakukan itu hanya di plsql, saya ingin melakukannya di plsql
vlebar

1
Jika ingin .tar, ambil restore.sqlfile dari arsip. Ia memiliki semua pernyataan buat.
Joseph Lust

15

Di baris perintah ( psql) Anda dapat menjalankan: \d <table name>untuk membuat daftar semua kolom, jenis dan indeksnya.


5
Ini membantu, tetapi tidak menjawab pertanyaan.
Ryan Tuck

4

Membangun bagian pertama dari jawaban @ CubicalSoft, Anda dapat memasukkan fungsi berikut yang seharusnya berfungsi untuk tabel sederhana (mengasumsikan skema 'publik' default dan menghilangkan batasan, indeks, dan tipe data yang ditentukan pengguna, dll.). Jawaban @RJS adalah satu-satunya cara untuk melakukannya dengan benar saat ini; ini adalah sesuatu yang harus dibangun ke 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;

Ini seharusnya jawaban yang diterima
exebook

Terima kasih untuk ini!
jujur

3

Saya menyadari bahwa saya agak terlambat ke pesta ini, tetapi ini adalah hasil pertama untuk Pencarian Google saya jadi saya pikir saya akan menjawab dengan apa yang saya hasilkan.

Anda bisa mendapatkan solusi yang cukup jauh dengan kueri ini untuk mendapatkan kolom:

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

Dan kemudian permintaan ini untuk indeks yang paling umum:

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

Maka itu adalah masalah membangun string kueri dalam format yang tepat.


2

Seperti yang dijawab dalam https://serverfault.com/a/875414/333439 , dengan \d <table>meta-command psqlmemungkinkan untuk memperlihatkan struktur tabel dalam database. Jika Anda ingin melihat kueri yang digunakan dalam meta-command, Anda bisa menggunakan perintah itu psql -E. Seperti yang dijelaskan dalam halaman manual, -Esakelar menggemakan \dkueri meta-command. Jadi, Anda bisa meluncurkan psql -E, Anda bisa melihat struktur tabel dengan \d <table>meta-command, dan, sesuai dengan -Eswitch, Anda bisa melihat kueri yang dihasilkan untuk menggambarkan struktur tabel


0

Di pgAdmin 4 , cari saja tabel di pohon di sebelah kiri, mis:

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

Ketika tabel dipilih, buka tab SQL di sebelah kanan. Ini menampilkan CREATE TABLEuntuk tabel yang dipilih.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.