丢弃序列和级联

时间:2012-04-03 21:33:12

标签: postgresql

我想使用CASCADE将表中使用的序列和表本身放在一个语句中,但是我收到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 个答案:

答案 0 :(得分:37)

您对依赖关系存在误解。该表永远不是相关序列的依赖对象,永远不会>被

删除
DROP SEQUENCE ... CASCADE;

只有序列中的DEFAULT值绘制“取决于”序列,如果使用CASCADE删除序列,则设置为NULL。

反过来说:如果序列由表列拥有,则使用

删除它
DROP TABLE f1 CASCADE;

对于由表列拥有的序列,您可以使用Milen已建议的serial类型。或者你可以ALTER an existing sequence

ALTER SEQUENCE seq1 OWNED BY t1.f1;

答案 1 :(得分:3)

我不知道你为什么要手动创建序列 - 也许你有理由,或者可能是因为习惯与另一个DBMS合作。

但是如果您对它没有特殊需要,请使用SERIAL伪类型,当您删除表时,SERIAL列后面的序列将是也掉了。

答案 2 :(得分:3)

您要求删除序列并级联该操作。虽然默认在没有序列的情况下不能存在,并且因此被删除,但表和列可以存在而没有序列,因此它们仍然存在。

按照您指定的方式,删除表不会丢弃序列,尽管您可以使序列依赖于使用它的列,因此 it 会自动删除如果你删除。您可以通过更改序列的所有者来执行此操作,或使用SERIAL代替。将列声明为SERIAL类型会自动创建一个序列,使其生成列的默认值,并使该列成为序列的所有者。

答案 3 :(得分:0)

drop cascade table table_name; 您也可以使用此...我还建议您使用带主键的序列,以便您可以唯一地标识列。