我想使用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中的第一步。
答案 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; 您也可以使用此...我还建议您使用带主键的序列,以便您可以唯一地标识列。