丢弃序列和级联

问题描述 投票:15回答:4

我想使用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中的第一步。

postgresql
4个回答
36
投票

你对依赖关系有误解。该表永远不是关联序列的依赖对象,并且永远不会被a删除

DROP SEQUENCE ... CASCADE;

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

反之亦然:如果序列由表列拥有,则将其删除

DROP TABLE f1 CASCADE;

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

ALTER SEQUENCE seq1 OWNED BY t1.f1;

3
投票

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

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


3
投票

您要求删除序列并级联该操作。虽然默认情况下不存在序列,但是因此它被删除,表和列可以不带序列而存在,因此它们保留。

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.