Sql 如何在oracle19c中设置自动递增复合主键?

Sql 如何在oracle19c中设置自动递增复合主键?,sql,oracle-sqldeveloper,auto-increment,composite-primary-key,oracle19c,Sql,Oracle Sqldeveloper,Auto Increment,Composite Primary Key,Oracle19c,我想在Oracle 19c中创建一个具有复合主键和自动增量的表,如下所示: pk01 pk02 column1 ==== ==== ======= 1 1 abc 1 2 def 1 3 ghi 2 1 jkl 2 2 mno 3 1 pqr 1 4 stu 如何操作?在此表上创建触发器以实现此结果。假设表名为test123 create or replace trigger trg_test123 befor

我想在Oracle 19c中创建一个具有复合主键和自动增量的表,如下所示:

pk01 pk02 column1
==== ==== =======
1    1    abc
1    2    def
1    3    ghi
2    1    jkl
2    2    mno
3    1    pqr
1    4    stu

如何操作?

在此表上创建触发器以实现此结果。假设表名为test123

create or replace trigger trg_test123 before insert on test123
for each row
declare
v_id1 number;
v_max_id2 number;
begin
v_id1 := :new.id1;
select nvl(max(id2), 0) into v_max_id2 from test123 where id1 = v_id1;
v_max_id2 := v_max_id2 +1;
:new.id2 := v_max_id2;
end;

为什么不创建单列pk00作为pk,并将其设置为autoincrement以用于存储?i、 e.像往常一样插入pk01钥匙(您需要它)。表中没有pk02,但在查询时使用窗口函数表达式:rank()over(按pk01分区,按pk00排序)作为pk02创建它

表00 pk00号码pk pk01号 第1列varchar2(100) ...

应用程序的其余部分使用表上的查询,如下所示

drop table table00;

create table table00 (
pk00 NUMBER GENERATED BY DEFAULT AS IDENTITY(START with 1 INCREMENT by 1),
pk01 number,
column1 varchar2(5),
column2 varchar2(5)
);


truncate table table00;

begin
insert into table00(pk01, column1, column2) values(1, 'abc', 'yest');
insert into table00(pk01, column1, column2) values(1, 'def', 'yest');
insert into table00(pk01, column1, column2) values(1, 'ghi', 'yest');
insert into table00(pk01, column1, column2) values(2, 'jkl', 'today');
insert into table00(pk01, column1, column2) values(2, 'mno', 'today');
insert into table00(pk01, column1, column2) values(2, 'pqr', 'today');
insert into table00(pk01, column1, column2) values(1, 'stu', 'yest');
commit;
end;
/

--select * from table00;

select
   --pk00,
   pk01,
   rank() over (partition by pk01 order by pk00) as pk02,
   column1,
   column2
from table00
order by 1,2
;



      PK01       PK02 COLUM COLUM
---------- ---------- ----- -----
         1          1 abc   yest 
         1          2 def   yest 
         1          3 ghi   yest 
         1          4 stu   yest 
         2          1 jkl   today
         2          2 mno   today
         2          3 pqr   today

7 rows selected. 
#######################


########################

您必须用PL/SQL编写此逻辑,但不能自动编写。您需要的是,如果第一列的值相同,则第二列应该递增。非常感谢,这对我太有用了。@GuillermoJesús如果解决方案适合您,请单击“向上投票”按钮并附上我的答案。谢谢