Có một MySQL tương đương với SHOW CREATE TABLE trong postgres không?


66

Có một MySQL tương đương với SHOW CREATE TABLEpostgres? Điều này có thể không? Nếu không giải pháp tốt nhất tiếp theo là gì?

Tôi cần câu lệnh vì tôi sử dụng nó để tạo bảng trên một máy chủ từ xa (trên WCF).


Và tôi nghĩ rằng MySQL là cơ sở dữ liệu thiếu tất cả các tính năng thú vị ...
Christopher K.

Câu trả lời:


27

Bạn có thể thử theo dõi trong tệp nhật ký PostgreQuery những gì "pg_dump -t bảng -s" thực sự làm. Sau đó, bạn có thể sử dụng cùng một phương pháp để viết hàm sql của riêng bạn.


ok, tôi truy tìm pg_dump. Nhưng nó không dễ như vậy, vì tôi phải viết hàm riêng của mình trong C # để viết câu lệnh tạo bảng. Nhưng đó là một sự giúp đỡ lớn, vì vậy cảm ơn bạn veeeeerrrryyyy nhiều. : D
vlebar

Không cần phải đi đến tất cả những rắc rối đó - theo ở đây, bạn có thể sử dụng -Etùy chọn để theo dõi những gì đang diễn ra trong nền khi bạn chạy một psqllệnh - -E: will describe the underlaying queries of the \ commands (cool for learning!)- HTH!

40

pg_dump:

pg_dump -st tablename dbname

hoặc sử dụng Công cụ GUI PostgreSQL (pgAdmin, phpPgAdmin, v.v.)


Tôi sẽ cố gắng giải thích vấn đề chi tiết hơn. Tôi cần câu lệnh sql (chọn hoặc lưu thủ tục) vì tôi thực thi lệnh sql trong C # (NpgsqlCommand). Vì vậy, tôi nghĩ rằng pg_dump không phải là giải pháp trong trường hợp này. :(
vlebar

1
Tại sao không? --schema-onlycó mục đích chính xác này: Hiển thị các câu lệnh SQL để tạo lược đồ / bảng. Bạn có thể cung cấp đầu ra này vào chương trình C # của mình bằng cách nào đó.
Sven

nhìn vào lượt xem information_schema: postgresql.org/docs/9.0/interactive/inif-schema.html
alvosu

1
@SvenW: Tôi sẽ làm điều đó nếu tôi có một bộ bảng đã biết. Vấn đề là người dùng có thể, nếu anh ta chọn, đồng bộ hóa bất kỳ bảng nào trong cơ sở dữ liệu đã chọn và sau đó tạo bảng đã chọn trên một máy chủ từ xa phía sau dịch vụ wcf. Tôi có thể làm điều đó với mssql và bây giờ tôi muốn mở rộng chương trình máy khách sang các máy chủ sql khác (mysql, oracle, postgresql, ...) OK, tôi có thể thực hiện pg_dump cho một bảng mà người dùng muốn đồng bộ hóa, nhưng nếu đó là tại tất cả những gì có thể để làm điều đó chỉ trong xin vui lòng, tôi muốn làm điều đó trong
xin vui lòng

1
Nếu đổ vào .tar, lấy restore.sqltệp từ kho lưu trữ. Nó có tất cả các báo cáo tạo.
Joseph Lust

15

Trong dòng lệnh ( psql) bạn có thể chạy: \d <table name>để liệt kê tất cả các cột, loại và chỉ mục của chúng.


5
Điều này rất hữu ích, nhưng không trả lời câu hỏi.
Ryan Tuck

4

Dựa trên phần đầu tiên của câu trả lời của @ CubicalSoft, bạn có thể bỏ qua hàm sau sẽ hoạt động cho các bảng đơn giản (giả sử lược đồ 'công khai' mặc định và bỏ qua các ràng buộc, chỉ mục và loại dữ liệu do người dùng xác định, v.v.). Câu trả lời @RJS là cách duy nhất để làm điều đó đúng vào lúc này; đây là một cái gì đó nên được xây dựng trong 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;

Đây phải là câu trả lời được chấp nhận
exebook

Cảm ơn vì điều này!
thẳng thắn

3

Tôi nhận ra rằng tôi đến hơi muộn với bữa tiệc này, nhưng đây là kết quả đầu tiên cho Tìm kiếm Google của tôi vì vậy tôi đoán rằng tôi đã trả lời với những gì tôi nghĩ ra.

Bạn có thể đi khá xa tới một giải pháp với truy vấn này để lấy các cột:

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

Và sau đó truy vấn này cho hầu hết các chỉ mục phổ biến:

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

Sau đó, vấn đề là xây dựng (các) chuỗi truy vấn theo đúng định dạng.


2

Như đã trả lời trong https://serverfault.com/a/875414/333439 , với lệnh \d <table>meta trong psqlcó thể hiển thị cấu trúc bảng trong cơ sở dữ liệu. Nếu bạn muốn xem truy vấn được sử dụng trong lệnh meta, bạn có thể sử dụng lệnh psql -E. Như được mô tả trong trang, công -Etắc lặp lại \dcác truy vấn lệnh meta. Vì vậy, bạn có thể khởi chạy psql -E, bạn có thể xem cấu trúc bảng bằng \d <table>lệnh meta và, theo -Echuyển đổi, bạn có thể xem truy vấn được tạo để mô tả cấu trúc bảng


0

Trong pgAdmin 4 , chỉ cần tìm bảng trong cây bên trái, ví dụ:

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

Khi bảng được chọn, hãy mở tab SQL ở bên phải. Nó hiển thị CREATE TABLEbảng đã chọn.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.