openplanning

Làm thế nào để drop tất cả các giàng buộc trên cơ sở dữ liệu Postgres?

  1. Drop Constraints

1. Drop Constraints

Vài năm về trước website của tôi (o7planning.org) sử dụng cơ sở dữ liệu Oracle, đây là một cơ sở dữ liệu tốt nhưng nó quá cồng kềnh và mất khá nhiều thời gian mỗi khi cài đặt lại, vì vậy tôi đã nghĩ đến một cơ sở dữ liệu mới để thay thế Oracle, và Postgres được chọn.
Vấn đề của tôi lúc đó là làm thế nào để chuyển dữ liệu từ Oracle sang Postgres, tôi đã viết một công cụ đơn giản để truy vấn từng bảng trên Oracle và trèn vào các bảng của Postgres. Các giàng buộc (constrants) trên Postgres cần được drop (bỏ đi) để đảm bảo quá trình trèn dữ liệu được thành công, và sau đó chúng sẽ được tạo lại.
Câu truy vấn dưới đây giúp tôi có được kịch bản để drop tất cả các giàng buộc trên Postgres, copy kết quả nhận được và lưu vào một file nào đó, chẳng hạn: drop_constraints.sql.
Generate Drop-Script
SELECT 'ALTER TABLE "'||nspname||'"."'||relname||'" DROP CONSTRAINT "'||conname||'";'
FROM pg_constraint
INNER JOIN pg_class ON conrelid=pg_class.oid
INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace
ORDER BY CASE WHEN contype='f' THEN 0 ELSE 1 END,contype,nspname,relname,conname
Tiếp theo, thực thi truy vấn dưới đây để có được kịch bản tạo lại tất cả các giàng buộc. Copy kết quả nhận được và lưu vào một file nào đó, chẳng hạn: recreate_constraints.sql.
Generate Recreate-Script
SELECT 'ALTER TABLE "'||nspname||'"."'||relname||'" ADD CONSTRAINT "'||conname||'" '||
   pg_get_constraintdef(pg_constraint.oid)||';'
FROM pg_constraint
INNER JOIN pg_class ON conrelid=pg_class.oid
INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace
ORDER BY CASE WHEN contype='f' THEN 0 ELSE 1 END DESC,
   contype DESC,nspname DESC,relname DESC,conname DESC;
Cuối cùng, tôi thực thi kịch bản drop trên pgAdmin, hoặc thực thi file drop_constrants.sql thông qua Terminal.
sudo -u postgres psql

\o    /path/to/drop_constraints.sql