24

CASCADE を使用して、テーブルで使用されているシーケンスとテーブル自体を 1 つのステートメントで削除したいのですが、NOTICE が表示され、テーブルが削除されません。例えば:

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

そして、私がするとき:

DROP SEQUENCE seq1 CASCADE;

次のメッセージが表示されますが、テーブルは削除されません。

NOTICE:  drop cascades to default for table t1 column f1

私は間違いなく何か間違ったことをしていますが、これらは PostgreSQL での私の最初のステップです。

4

4 に答える 4

51

依存関係について誤解しています。テーブルは、関連付けられたシーケンスの依存オブジェクトになることはなく、によって削除されることもありません。

DROP SEQUENCE ... CASCADE;

シーケンスから抽出された DEFAULT 値のみがシーケンスに「依存」し、 でシーケンスが削除された場合は NULL に設定されますCASCADE

これは逆です。シーケンスがテーブル列によって所有されている場合、それは

DROP TABLE f1 CASCADE;

テーブル列が所有するシーケンスの場合、serialMilen が既に提案したタイプを使用できます。または、既存のシーケンスを ALTER することもできます:

ALTER SEQUENCE seq1 OWNED BY t1.f1;
于 2012-04-03T22:07:02.377 に答える
6

シーケンスを手動で作成する理由がわかりません。正当な理由があるのか​​もしれませんし、別の DBMS を使用する習慣が原因かもしれません。

ただし、特別な必要がない場合は、SERIAL疑似型を使用してください。テーブルを削除すると、SERIAL列の後ろのシーケンスも削除されます。

于 2012-04-03T21:49:47.793 に答える
4

シーケンスを削除して、そのアクションをカスケードするように依頼しました。デフォルトはシーケンスなしでは存在できないため削除されますが、テーブルと列はシーケンスなしで存在できるためそのまま残ります。

これを指定した方法では、テーブルを削除してもシーケンスは削除されませんが、シーケンスを使用する列に依存させることができるため、テーブルを削除すると自動的に削除れます。これを行うには、シーケンスの所有者を変更するか、代わりに SERIAL を使用します。列を SERIAL 型として宣言すると、自動的にシーケンスが作成され、列のデフォルトが生成され、その列がシーケンスの所有者になります。

于 2012-04-03T22:06:02.343 に答える