丢弃序列和级联

Chr*_*ton 18 postgresql

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

CREATE SEQUENCE seq1;
CREATE TABLE t1 (f1 INT NOT NULL DEFAULT nextval('seq1'));
Run Code Online (Sandbox Code Playgroud)

然后当我这样做时:

DROP SEQUENCE seq1 CASCADE;
Run Code Online (Sandbox Code Playgroud)

我收到以下消息,表格未被删除:

NOTICE:  drop cascades to default for table t1 column f1
Run Code Online (Sandbox Code Playgroud)

我肯定做错了,但这些是我在PostgreSQL中的第一步.

Erw*_*ter 41

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

DROP SEQUENCE ... CASCADE;
Run Code Online (Sandbox Code Playgroud)

只有序列中的DEFAULT值绘制"取决于"序列,如果序列被删除,则设置为NULL CASCADE.

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

DROP TABLE f1 CASCADE;
Run Code Online (Sandbox Code Playgroud)

对于由表列拥有的序列,您可以使用serialMilen已建议的类型.或者您可以更改现有序列:

ALTER SEQUENCE seq1 OWNED BY t1.f1;
Run Code Online (Sandbox Code Playgroud)


Mil*_*dev 6

我不知道你为什么要手动创建一个序列——也许你有理由,或者可能是由于使用另一个 DBMS 的习惯。

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


kgr*_*ttn 5

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

按照您指定的方式,删除表不会删除序列,尽管您可以使序列取决于使用它的列,因此如果您删除表,会自动删除。您可以通过更改序列的所有者或使用 SERIAL 来实现此目的。将列声明为 SERIAL 类型会自动创建一个序列,使其生成该列的默认值,并使该列成为该序列的所有者。