Sql 如何解决唯一约束错误?

Sql 如何解决唯一约束错误?,sql,oracle,Sql,Oracle,下面是我的代码 declare v1 tblsubject.subjectseq%type; v2 tblteam.teamname%type; cursor vcursor is select distinct t5.SUBJECTSEQ, t1.TEAMNAME from tblteam t1 inner join TBLCLASS t2 on t1.CLASSSEQ = t2.CLASSSEQ

下面是我的代码

declare
    v1 tblsubject.subjectseq%type;
    v2 tblteam.teamname%type;
    cursor vcursor is
        select distinct t5.SUBJECTSEQ, t1.TEAMNAME
        from tblteam t1
                 inner join TBLCLASS t2 on t1.CLASSSEQ = t2.CLASSSEQ
                 inner join TBLOPENCOURSE T on T.OPENCOURSESEQ = t2.OPENCOURSESEQ
                 inner join TBLOPENSUBJECT T3 on T.OPENCOURSESEQ = T3.OPENCOURSESEQ
                 inner join TBLAVAILABLESUBJECT T4 on T4.AVAILABLESUBJECTSEQ = T3.AVAILABLESUBJECTSEQ
                 inner join TBLSUBJECT T5 on T5.SUBJECTSEQ = t4.SUBJECTSEQ;
begin
    open vcursor;
    loop
        fetch vcursor into v1, v2;
        insert into tblproject
        select rownum, t5.SUBJECTNAME || 'project', T3.SUBJECTEND, t1.TEAMSEQ
from tblteam t1
         inner join TBLCLASS t2 on t1.CLASSSEQ = t2.CLASSSEQ
         inner join TBLOPENCOURSE T on T.OPENCOURSESEQ = t2.OPENCOURSESEQ
         inner join TBLOPENSUBJECT T3 on T.OPENCOURSESEQ = T3.OPENCOURSESEQ
         inner join TBLAVAILABLESUBJECT T4 on T4.AVAILABLESUBJECTSEQ = T3.AVAILABLESUBJECTSEQ
         inner join TBLSUBJECT T5 on T5.SUBJECTSEQ = t4.SUBJECTSEQ
where (v1, v2) in (
    select distinct t5.SUBJECTSEQ, t1.TEAMNAME
    from tblteam t1
             inner join TBLCLASS t2 on t1.CLASSSEQ = t2.CLASSSEQ
             inner join TBLOPENCOURSE T on T.OPENCOURSESEQ = t2.OPENCOURSESEQ
             inner join TBLOPENSUBJECT T3 on T.OPENCOURSESEQ = T3.OPENCOURSESEQ
             inner join TBLAVAILABLESUBJECT T4 on T4.AVAILABLESUBJECTSEQ = T3.AVAILABLESUBJECTSEQ
             inner join TBLSUBJECT T5 on T5.SUBJECTSEQ = t4.SUBJECTSEQ);
        exit when vcursor%notfound;
        dbms_output.PUT_LINE(v1);
        dbms_output.PUT_LINE(v2);
    end loop;
end;
第14行的表格结构为:

create table TBLPROJECT
(
    PROJECTSEQ NUMBER not null
        constraint TBLPROJECT_PK
        primary key,
    PROJECTREGIST VARCHAR2(300),
    PROJECTSUBMITDATE DATE,
    TEAMSEQ NUMBER
)
执行PL/SQL语句

[2021-06-03 20:22:44] [23000][1]
[2021-06-03 20:22:44] ORA-00001: unique constraint (SIST2.TBLPROJECT_PK) violated
[2021-06-03 20:22:44] ORA-06512: at line 16
[2021-06-03 20:22:44] Position: 0
出现上述错误

我没有任何违反完整性约束的代码,我不知道如何修复它


最好的祝愿

您的循环退出条件位于错误的位置;应该是:

    loop
        fetch vcursor into v1, v2;
        exit when vcursor%notfound;
        insert into tblproject
        ...
在最后一次成功获取导致插入的时刻;然后,您再次提取,但没有找到更多的数据,但您仍然根据上次提取的值进行插入,这将是一个重复的值

您可能也希望在插入之前调用
dbms\u输出
,这样您至少可以调试导致插入失败的值

但是,使用
rownum
看起来也会导致重复,因为这将为循环的每个迭代重复值。你可以看到,;每次循环都会得到相同的
rn
值(作为
rownum
的别名)。当它尝试插入该值而不是仅打印值时,它会尝试插入具有相同PK值的两行-这会导致约束错误

这个PK值可能应该取自一个序列(或者使它成为一个标识列),但这取决于您现在为什么这样做


这可能根本不需要PL/SQL;但是,将代码重写为单个insert语句超出了范围。

好吧,Oracle不同意您的观点,即您的代码违反了完整性约束。我不太明白你想做什么,但是在循环中用
rownum
填充主键是不可能的。每个查询将以1的
rownum
开始,因此如果
insert
尝试在循环的多个迭代中插入行,则您将违反约束,尝试插入主键值为1的多行。通常,您会使用序列填充主键,并在
insert
语句中选择序列的
nextval
。表为空。。。当在提取下但未解决时退出,表为空-启动时的目标表?如果代码中的插入是重复的,这并不重要。正如我和贾斯汀都说的,使用
rownum
将导致重复;第二次循环时,您将再次获得从1开始的
rownum
值,这将立即成为一个重复的PK。