Trước hết, một chuỗi được tạo tự động cho một cột nối tiếp được xóa tự động , khi cột (hoặc bảng nằm trong) bị xóa. Vấn đề bạn mô tả không nên tồn tại để bắt đầu. Chỉ rất các phiên bản cũ của PostgreSQL không làm được điều đó. 7.4 trở lên?
Giải pháp cho vấn đề:
Truy vấn này sẽ tạo các lệnh DDL để xóa tất cả các chuỗi "không liên kết" trong cơ sở dữ liệu, nó được thực thi trong:
SELECT string_agg('DROP SEQUENCE ' || c.oid::regclass, '; ') || ';' AS ddl
FROM pg_class c
LEFT JOIN pg_depend d ON d.refobjid = c.oid
AND d.deptype <> 'i'
WHERE c.relkind = 'S'
AND d.refobjid IS NULL;
Truyền đến regclass
trong c.oid::regclass
tự động lược đồ đủ điều kiện cho các tên trình tự khi cần thiết theo search_path
hiện tại . Xem:
- Cách kiểm tra xem một bảng có tồn tại trong một lược đồ nhất định hay không
- Tìm kiếm_path ảnh hưởng như thế nào đến độ phân giải của số nhận dạng và" giản đồ hiện tại "
Kết quả:
DROP SEQUENCE foo_id_seq;
DROP SEQUENCE bar_id_seq;
...
Thực thi kết quả để loại bỏ tất cả các chuỗi không bị ràng buộc vào một cột nối tiếp (hoặc bất kỳ cột nào khác). Nghiên cứu ý nghĩa của cột và bảng tại đây .
Cẩn thận Tuy nhiên! Nó không có nghĩa là những trình tự đó không được sử dụng theo cách khác. Có một số trường hợp sử dụng trong đó chuỗi được tạo dưới dạng các đối tượng độc lập. Ví dụ:nếu bạn muốn nhiều cột chia sẻ một chuỗi. Bạn nên biết chính xác những gì bạn đang làm.
Tuy nhiên, bạn không thể xóa các chuỗi liên kết với một serial
cột theo cách này. Vì vậy, hoạt động an toàn trong này tôn trọng.
DROP SEQUENCE test_id_seq
Kết quả:
ERROR: cannot drop sequence test_id_seq because other objects depend on it
DETAIL: default for table test column id depends on sequence test_id_seq
HINT: Use DROP ... CASCADE to drop the dependent objects too.