2012-04-03 25 views
13

Tôi muốn thả trình tự được sử dụng trong bảng và bảng trong một câu lệnh bằng CASCADE, nhưng tôi nhận được thông báo và bảng không bị xóa. Ví dụ:Thả chuỗi và xếp hàng

CREATE SEQUENCE seq1; 
CREATE TABLE t1 (f1 INT NOT NULL DEFAULT nextval('seq1')); 

Và sau đó khi tôi làm:

DROP SEQUENCE seq1 CASCADE; 

tôi nhận được sau tin nhắn, và bảng không được giảm:

NOTICE: drop cascades to default for table t1 column f1 

Tôi chắc chắn làm điều gì đó sai nhưng đây là những bước đầu tiên của tôi trong PostgreSQL.

Trả lời

27

Bạn có quan niệm sai về phụ thuộc. Bảng không bao giờ là một đối tượng phụ thuộc vào một chuỗi liên quan và là bao giờ giảm một

DROP SEQUENCE ... CASCADE; 

Chỉ có một giá trị DEFAULT rút ra từ dãy "phụ thuộc" về trình tự, được thiết lập để NULL nếu chuỗi sẽ bị xóa với CASCADE.

Nó được theo chiều ngược lại: nếu chuỗi được sở hữu bởi một cột bảng nó được giảm với một

DROP TABLE f1 CASCADE; 

Đối với một chuỗi để được sở hữu bởi một cột bảng bạn có thể sử dụng các loại serial như Milen đã gợi ý. Hoặc bạn có thể ALTER an existing sequence:

ALTER SEQUENCE seq1 OWNED BY t1.f1; 
3

Tôi không biết tại sao bạn tạo chuỗi theo cách thủ công - có thể bạn đã biện minh hoặc có thể do thói quen làm việc với một DBMS khác.

Nhưng nếu bạn không có nhu cầu đặc biệt, hãy sử dụng loại SERIAL giả và khi bạn thả bảng (các) trình tự phía sau các cột SERIAL cũng sẽ bị xóa.

+0

Ban đầu tôi nghĩ rằng tôi không thể khởi tạo trình tự sử dụng macro SERIAL , nhưng bây giờ tôi thấy rằng nó tạo ra một chuỗi thường xuyên mà tôi có thể khởi tạo bình thường. Chuyển sang SERIAL, cảm ơn. –

3

Bạn đã yêu cầu thả trình tự và thực hiện hành động đó. Mặc dù mặc định không thể tồn tại mà không có trình tự và do đó bị xóa, bảng và cột có thể tồn tại mà không có trình tự, do đó chúng vẫn tồn tại. Với cách bạn đã xác định điều này, việc thả bảng sẽ không thả chuỗi, mặc dù bạn có thể làm cho chuỗi phụ thuộc vào cột mà nó được sử dụng và do đó có thả tự động nếu bạn thả bảng. Bạn có thể làm điều này bằng cách thay đổi chủ sở hữu của chuỗi hoặc sử dụng SERIAL thay thế. Việc khai báo một cột là kiểu SERIAL sẽ tự động tạo một chuỗi, làm cho nó tạo ra một giá trị mặc định cho cột, và làm cho cột đó là chủ sở hữu của chuỗi.

0

drop cascade table table_name; bạn cũng có thể sử dụng ... và tôi cũng sẽ khuyên bạn nên sử dụng một nối tiếp với khóa chính để bạn có thể xác định một cột duy nhất ..

Các vấn đề liên quan