不能删除系统生成的序列

Ill*_*gal 3 sql oracle oracle12c

我的 Oracle 12c 数据库中有一个系统生成的序列,我似乎无法摆脱它。在它上面调用“drop sequence”会得到这个错误:

错误代码:ORA-32794
说明:无法删除系统生成的序列
原因:尝试删除系统生成的序列。
行动:不能删除系统生成的序列,例如为标识列创建的序列。

该序列用于为表的 Id 列生成值,并且该表不再存在。通常,我可以创建和删除这样的表,序列也会随之删除。我不知道在这种情况下删除表的语句,但我真的很想删除杂散序列。

Wil*_*son 14

您不需要显式删除标识列序列,因为它与表相关联,并且使用purge选项删除表(或正常删除并清空回收站)也将删除该序列。

create table test_tbl (id  number generated as identity);

Table created.

select * from user_tab_identity_cols;

TABLE_NAME                     COLUMN_NAME GENERATION_TYPE SEQUENCE_NAME IDENTITY_OPTIONS
------------------------------ ----------- --------------- ------------- --------------------------------------------------------------------------------
TEST_TBL                       ID          ALWAYS          ISEQ$$_124811 START WITH: 1, INCREMENT BY: 1, MAX_VALUE: 9999999999999999999999999999, MIN_VAL
Run Code Online (Sandbox Code Playgroud)

删除表会将表及其序列留在回收站中:

drop table test_tbl;

Table dropped.

select * from user_tab_identity_cols;

TABLE_NAME                     COLUMN_NAME GENERATION_TYPE SEQUENCE_NAME IDENTITY_OPTIONS
------------------------------ ----------- --------------- ------------- --------------------------------------------------------------------------------
BIN$gQ8wv//QTjK+mAGxdffxgQ==$0 ID          ALWAYS          ISEQ$$_124811 START WITH: 1, INCREMENT BY: 1, MAX_VALUE: 9999999999999999999999999999, MIN_VAL
Run Code Online (Sandbox Code Playgroud)

清空回收站将其清除:

purge recyclebin;

Recyclebin purged.

select * from user_tab_identity_cols;

no rows selected

select * from user_sequences where sequence_name like 'ISEQ$$%';

no rows selected
Run Code Online (Sandbox Code Playgroud)

  • *“您不需要显式删除标识列序列”* 我似乎记得 12c R1 的初始版本存在一个问题,删除带有标识列的表不会删除系统生成的序列。这很痛苦,因为在开发过程中我们经常丢弃和重建模式。但在以后的版本中,这肯定不再是问题。 (3认同)
  • “清除回收站”清理它们。感谢您的解释。 (2认同)