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.
Câu trả lời:
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.
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$$;
- 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