Thả ràng buộc theo tên trong Postgresql


83

Làm thế nào tôi có thể bỏ một tên ràng buộc trong Postgresql chỉ bằng cách biết tên? Tôi có một danh sách các ràng buộc được tạo tự động bởi tập lệnh của bên thứ ba. Tôi cần xóa chúng mà không cần biết tên bảng chỉ là tên ràng buộc.


Bạn đang sử dụng phiên bản PG nào?
Kuberchaun

Câu trả lời:


135

Bạn cần truy xuất tên bảng bằng cách chạy truy vấn sau:

SELECT *
FROM information_schema.constraint_table_usage
WHERE table_name = 'your_table'

Ngoài ra, bạn có thể sử dụng pg_constraintđể lấy thông tin này

select n.nspname as schema_name,
       t.relname as table_name,
       c.conname as constraint_name
from pg_constraint c
  join pg_class t on c.conrelid = t.oid
  join pg_namespace n on t.relnamespace = n.oid
where t.relname = 'your_table_name';

Sau đó, bạn có thể chạy câu lệnh ALTER TABLE được yêu cầu:

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

Tất nhiên, bạn có thể thực hiện truy vấn trả về câu lệnh thay thế hoàn chỉnh:

SELECT 'ALTER TABLE '||table_name||' DROP CONSTRAINT '||constraint_name||';'
FROM information_schema.constraint_table_usage
WHERE table_name in ('your_table', 'other_table')

Đừng quên bao gồm table_schema trong mệnh đề WHERE (và câu lệnh ALTER) nếu có nhiều lược đồ với các bảng giống nhau.


14

Nếu bạn trên 9.x PG, bạn có thể sử dụng câu lệnh DO để chạy điều này. Chỉ cần làm những gì a_horse_with_no_name đã làm, nhưng áp dụng nó cho một câu lệnh DO.

DO $$DECLARE r record;
    BEGIN
        FOR r IN SELECT table_name,constraint_name
                 FROM information_schema.constraint_table_usage
                 WHERE table_name IN ('your_table', 'other_table')
        LOOP
            EXECUTE 'ALTER TABLE ' || quote_ident(r.table_name)|| ' DROP CONSTRAINT '|| quote_ident(r.constraint_name) || ';';
        END LOOP;
    END$$;

3

- Bỏ ràng buộc khóa ngoại bên phải

ALTER TABLE affiliations
DROP CONSTRAINT affiliations_organization_id_fkey;

GHI CHÚ:

chi nhánh -> Tên bảng

affiliations_organization_id_fkey -> Tên tương phả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.