重置序列(在这种情况下删除并重新创建)对表中已存在的数据没有影响。除了通过您的代码之外,序列和表之间没有真正的关系。(例如,您可以在多个表中使用相同的序列)。如果您在 12c+ 中使用标识列,那将是不正确的;但你不在你的例子中。
所以实际上你所做的是:
create sequence bill_tos_seq;
insert into bill_tos_sr (bill_to_no, ...) values (bill_tos_seq.nextval, ...);
drop sequence bill_tos_seq;
create sequence bill_tos_seq;
insert into bill_tos_sr (bill_to_no, ...) values (bill_tos_seq.nextval, ...);
除非您另外指定,否则序列的两个版本都将从 1 开始,这意味着您的两个插入都将尝试创建bill_to_no
设置为 1 的行 - 这违反了约束。
您需要先从表中删除数据,然后再尝试重新插入。如果一开始是空的,那么您可以进行简单的截断或删除(当然要小心!)。
create sequence bill_tos_seq;
insert into bill_tos_sr (bill_to_no, ...) values (bill_tos_seq.nextval, ...);
drop sequence bill_tos_seq;
truncate table bill_tos_sr;
create sequence bill_tos_seq;
insert into bill_tos_sr (bill_to_no, ...) values (bill_tos_seq.nextval, ...);
如果在您开始之前它已经有一些数据,那么您需要弄清楚您第一次插入了哪些行并只删除那些。
您还可以通过回滚测试并重新运行它:
create sequence bill_tos_seq;
insert into bill_tos_sr (bill_to_no, ...) values (bill_tos_seq.nextval, ...);
rollback;
drop sequence bill_tos_seq;
create sequence bill_tos_seq;
insert into bill_tos_sr (bill_to_no, ...) values (bill_tos_seq.nextval, ...);
请注意,如果您这样做,则必须在删除/创建序列之前,因为 DDL 隐式提交;因此之后的回滚将无效。
有可能您在错误的点回滚,或者您根本没有回滚并且没有意识到由于其他原因已经提交了数据 - 也许您退出了 SQL*Plus 并且没有意识到这将提交也默认。提交数据后,您必须先将其删除,然后才能重新插入,否则您将继续违反约束。
但是,这与假脱机输出无关。