0

我正在创建插入语句来填充我的表。当我测试它们时它们运行良好,然而,当我开始假脱机之前工作的相同代码突然给我一个错误(ORA-00001:违反唯一约束)。在研究该问题时,似乎是在尝试将重复信息输入表时出现问题。但是,我总是在假脱机之前清除序列并重新输入它们,所以这没有意义。这是我正在尝试运行的示例,正​​如我所说的那样,代码可以正常工作:

SQL> INSERT INTO bill_tos_sr
2 (
3 bill_to_no,
4 bill_to_name,
5 bill_to_street,
6 bill_to_city,
7 bill_to_state,
8 bill_to_zip,
9 bill_to_phone  
10 )
11 VALUES
12 (bill_tos_seq.NEXTVAL,
13 'Walmart',
14 '1000 Indiantown St',
15 'Ft Lauderdale',
16 'FL',
17 '33401',
18 '9438476698'
19 );
INSERT INTO bill_tos_sr
*
ERROR at line 1:
ORA-00001: unique constraint (MONPM16.BILL_TO_NO_PK) violated
4

2 回答 2

1

重置序列(在这种情况下删除并重新创建)对表中已存在的数据没有影响。除了通过您的代码之外,序列和表之间没有真正的关系。(例如,您可以在多个表中使用相同的序列)。如果您在 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 并且没有意识到这将提交也默认。提交数据后,您必须先将其删除,然后才能重新插入,否则您将继续违反约束。

但是,这与假脱机输出无关。

于 2018-12-04T17:11:55.337 回答
0

我假设BILL_TO_NO_PK是该列的 PK/唯一约束BILL_TO_NO

插入时,您将提供来自序列的新值bill_tos_seq.NEXTVAL。似乎序列已重新启动,或者该数据是在表中手动输入的。

在任何情况下,序列值都会与表中的现有数据发生冲突。

解决方案?我会找到该列的最大值,然后将序列值设置为比该值大一。

于 2018-12-04T16:49:17.863 回答