2012-06-08 17 views
23

Có ai biết cách tìm OID của bảng trong Postgres 9.1 không? Tôi đang viết một kịch bản cập nhật cần kiểm tra sự tồn tại của một cột trong một bảng trước khi nó cố tạo cột. Điều này là để ngăn chặn chạy của kịch bản sau khi người đầu tiên từ lỗi ra.Xác định OID của bảng trong Postgres 9.1?

Trả lời

18

Bảng danh mục bưu chính pg_class là những gì bạn nên xem. Sẽ có một hàng trên mỗi bảng, với tên bảng trong cột relname và cột trong cột bị ẩn oid.

Bảng danh mục nằm trong cơ sở dữ liệu postgres, vì vậy hãy đảm bảo kết nối với cơ sở dữ liệu đó thay vì cơ sở dữ liệu ứng dụng của bạn.

Bạn cũng có thể quan tâm đến bảng danh mục pg_attribute, bao gồm một hàng cho mỗi cột trong bảng.

Xem: http://www.postgresql.org/docs/current/static/catalog-pg-class.htmlhttp://www.postgresql.org/docs/current/static/catalog-pg-attribute.html

+1

Tôi đã thấy các tài liệu trên bảng 'pg_class' và' pg_attribute', nhưng tôi không biết rằng có một cột ẩn có tên 'oid' trong bảng' pg_class'. Tôi không thể tìm ra nơi oid là từ các tài liệu. Cảm ơn! –

+6

Điều này không hoàn toàn chính xác. Mỗi cơ sở dữ liệu có một lược đồ có tên là 'pg_catalog', trong đó có các bảng danh mục cụ thể cho cơ sở dữ liệu. –

+0

Tôi thứ hai @TonyVitabile. Đó là cột ẩn 'oid' mà tôi đang tìm kiếm. –

31

Có một cách đơn giản để có được một bảng OID. Đúc đến object-identifier classregclass (khi kết nối với DB tương ứng):

SELECT 'mytbl'::regclass::oid; 

giá trị mặc định này vào giản đồ đầu tiên trong search_path hoặc đặt ra một ngoại lệ nếu không tìm thấy.
Hoặc schema-đủ điều kiện explicitely:

SELECT 'myschema.mytbl'::regclass::oid; 

Sau đó, bạn chỉ cần kiểm tra Danh mục bảng pg_attribute cho sự tồn tại của các cột:

SELECT TRUE AS col_exists 
FROM pg_attribute 
WHERE attrelid = 'mytbl'::regclass 
AND attname = 'mycol' 
AND NOT attisdropped -- no dropped (dead) columns 
-- AND attnum > 0  -- no system columns (you may or may not want this) 

Trong Postgres 9.4 hay muộn bạn cũng có thể sử dụng to_regclass('mytbl') , không tăng ngoại lệ nếu bảng không được tìm thấy:

2

Chỉ cần để hoàn thành các khả năng tôi muốn thêm rằng có tồn tại một cú pháp cho thả cột để không có lỗi ra:

ALTER TABLE mytbl DROP COLUMN IF EXISTS mycol

Xem http://www.postgresql.org/docs/9.0/static/sql-altertable.html

Sau đó, bạn có thể thêm cột của mình một cách an toàn.

0
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r'; 
+1

Giải thích sẽ đẹp ... – eirikir

Các vấn đề liên quan