Giải pháp này hơi giống với câu trả lời của Erwin Brandstetter, nhưng chỉ sử dụng ngôn ngữ sql. Không phải tất cả các cài đặt PostgreSQL đều có ngôn ngữ plpqsql theo mặc định, điều này có nghĩa là bạn có thể phải gọi CREATE LANGUAGE plpgsql
trước khi tạo hàm, và sau đó phải loại bỏ ngôn ngữ một lần nữa, để cơ sở dữ liệu ở trạng thái giống như trước đây (nhưng chỉ khi cơ sở dữ liệu không có ngôn ngữ plpgsql để bắt đầu). Xem mức độ phức tạp tăng lên như thế nào?
Việc thêm plpgsql có thể không có vấn đề nếu bạn đang chạy tập lệnh cục bộ, tuy nhiên, nếu tập lệnh được sử dụng để thiết lập lược đồ tại một khách hàng, có thể không muốn thay đổi như thế này trong cơ sở dữ liệu khách hàng.
Giải pháp này được lấy cảm hứng từ a post by Andreas Scherbaum.
-- Function which creates table
CREATE OR REPLACE FUNCTION create_table() RETURNS TEXT AS $$
CREATE TABLE table_name (
i int
);
SELECT 'extended_recycle_bin created'::TEXT;
$$
LANGUAGE 'sql';
-- Test if table exists, and if not create it
SELECT CASE WHEN (SELECT true::BOOLEAN
FROM pg_catalog.pg_tables
WHERE schemaname = 'public'
AND tablename = 'table_name'
) THEN (SELECT 'success'::TEXT)
ELSE (SELECT create_table())
END;
-- Drop function
DROP FUNCTION create_table();
@ErwinBrandstetter: Điều này có thể đang khôi phục một chuỗi rất cũ không có mục đích, nhưng liên kết mà bạn đã cung cấp trỏ tới cùng một trang này. –