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
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.html và http://www.postgresql.org/docs/current/static/catalog-pg-attribute.html
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:
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.
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';
Giải thích sẽ đẹp ... – eirikir
- 1. Postgres 9.1 CẤP không hoạt động
- 2. Bảng OID cho chủ đề của chứng chỉ?
- 3. sudo: người dùng không xác định: postgres
- 4. Hạn chế tên cột của bảng Postgres?
- 5. postgresql 9.1 - bảng truy cập thông qua các chức năng
- 6. xác định loại bảng của Arduino
- 7. Phân vùng bảng động trong postgres
- 8. Postgres pg_toast trong autovacuum - bảng nào?
- 9. Truy vấn OID số trong PySNMP?
- 10. ALTER TABLE, thiết lập null trong cột không null, PostgreSQL 9.1
- 11. không thể tìm thấy adminpack.sql trong postgresql 9.1
- 12. giới hạn mảng array_agg trong Postgresql 9.1
- 13. Tham gia bảng postgres trên hai cột?
- 14. SNMP: Tạo OID tùy chỉnh
- 15. MySQL: Xác định Primary Key động Bảng của
- 16. cách xác định kích thước của không gian bảng 11g
- 17. postgres múi giờ mặc định
- 18. làm thế nào để sử dụng datatype hình học để postgres bảng?
- 19. Tuyên bố SQLAlchemy: xác định trình kích hoạt và chỉ mục (Postgres 9)
- 20. tạo bảng bên ngoài với tiêu đề trong Netezza (postgres)
- 21. Postgres: xác định giá trị mặc định cho các lỗi CAST?
- 22. Chọn số hàng trong bảng khác trong câu lệnh SELECT của Postgres
- 23. Đâu là bảng con trong một mối quan hệ xác định hoặc không xác định?
- 24. Trợ cấp truy vấn cho một bảng trong postgres
- 25. Cột không xác định - nhiều kết nối trong CDbCriteria
- 26. Công cụ bảng không xác định 'InnoDB'
- 27. Truy vấn hiệu quả bảng Postgres đa phân vùng
- 28. TypeScript Xác định bảng băm chức năng
- 29. Cách xác định vị trí của bảng trong tệp pdf bằng iTextsharp trong C#
- 30. Xác định yêu cầu của grunt 'không xác định'
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! –
Đ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. –
Tôi thứ hai @TonyVitabile. Đó là cột ẩn 'oid' mà tôi đang tìm kiếm. –