24

我想使用 CASCADE 在一个语句中删除 table 中使用的序列和 table 本身,但我收到 NOTICE 并且 table 没有被删除。例如:

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 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 回答
1

删除级联表 table_name; 您也可以使用它...我还建议您使用带有主键的序列号,以便您可以唯一地识别一列..

于 2018-03-01T11:58:37.283 回答