在我看来,这是一个错误的数据模型。为了将来的缘故,您应该对其进行规范化,因为 - 创建新分区时您会做什么(16 - 20)?改变表?修改您已编写的所有代码以包含新分区?祝你好运!
(此外,您的问题不是关于建模,而是在插入期间“解决”,即在应用程序代码中 - 而不是数据模型中。正如我所说的那样,这是错误的,在我的意见)。
这是我的建议;考虑一下。
这是“主”表;在您当前的模型中,它包含 3 个附加列(分区):
SQL> create table table_1
2 (id_tab number primary key,
3 description varchar2(20),
4 status varchar2(2)
5 );
Table created.
分区列表。如果创建了新分区(16 - 20),您只需在该表中插入一个新行 - 不应更改任何代码,也不应更改任何表。
SQL> create table part
2 (id_part number primary key,
3 description varchar2(20)
4 );
Table created.
SQL> insert into part (id_part, description)
2 select 1, ' 0 - 5' from dual union all
3 select 2, ' 6 - 10' from dual union all
4 select 3, '11 - 15' from dual;
3 rows created.
分区阶段:
SQL> create table part_stage
2 (id_part_stage number primary key,
3 id_part number references part (id_part),
4 task varchar2(20)
5 );
Table created.
SQL> insert into part_stage (id_part_stage, id_part, task)
2 select 0, 1, 'start' from dual union all
3 select 1, 1, 'build' from dual union all
4 select 2, 1, 'test' from dual union all
5 select 3, 1, 'reg test' from dual union all
6 select 4, 1, 'A' from dual union all
7 select 5, 1, 'B' from dual union all
8 select 6, 2, 'C' from dual union all
9 select 7, 2, 'D' from dual union all
10 select 8, 2, 'E' from dual union all
11 select 9, 2, 'F' from dual union all
12 select 10, 2, 'G' from dual union all
13 select 11, 3, 'H' from dual union all
14 select 12, 3, 'I' from dual union all
15 select 13, 3, 'J' from dual union all
16 select 14, 3, 'K' from dual union all
17 select 15, 3, 'L' from dual;
16 rows created.
此表用于将主表 (table_1) “映射”到分区阶段 (part_stage)。这样做很灵活,因此您可以根据需要为每个主记录添加任意数量的分区阶段。如果创建了新分区,也没有问题 - 它(再次)只是tmap 表中的另一行。
SQL> create table tmap
2 (id_map number primary key,
3 id_tab number references table_1 (id_tab),
4 id_part_stage number references part_stage (id_part_stage)
5 );
Table created.
序列(用于主键):
SQL> create sequence seqmap;
Sequence created.
插入会是什么样子?
SQL> declare
2 l_id_tab number := seqmap.nextval;
3 begin
4 -- parent record
5 insert into table_1 (id_tab, description, status)
6 values (l_id_tab, 'Test insert', 'A1');
7
8 -- child record (build)
9 insert into tmap (id_map, id_tab, id_part_stage)
10 values (seqmap.nextval, l_id_tab, 1);
11
12 -- child record (C)
13 insert into tmap (id_map, id_tab, id_part_stage)
14 values (seqmap.nextval, l_id_tab, 6);
15 end;
16 /
PL/SQL procedure successfully completed.
要插入什么?
SQL> select * from table_1;
ID_TAB DESCRIPTION ST
---------- -------------------- --
1 Test insert A1
SQL> select * from tmap;
ID_MAP ID_TAB ID_PART_STAGE
---------- ---------- -------------
2 1 1
3 1 6
“报告”显示什么属于什么:
SQL> select a.id_tab, a.description, a.status, p.description, ps.task
2 from table_1 a join tmap t on t.id_tab = a.id_tab
3 join part_stage ps on ps.id_part_stage = t.id_part_stage
4 join part p on p.id_part = ps.id_part
5 where a.id_tab = 1;
ID_TAB DESCRIPTION ST DESCRIPTION TASK
---------- -------------------- -- -------------------- --------------------
1 Test insert A1 0 - 5 build
1 Test insert A1 6 - 10 C
SQL>
创建新分区时会发生什么?没什么,只是一些插入:
SQL> insert into part (id_part, description)
2 select 4, '16 - 20' from dual;
1 row created.
SQL> insert into part_stage (id_part_stage, id_part, task)
2 select 16, 4, 'M' from dual union all
3 select 17, 4, 'N' from dual union all
4 select 18, 4, 'O' from dual union all
5 select 19, 4, 'P' from dual union all
6 select 20, 4, 'Q' from dual;
5 rows created.
向现有的table_1 记录添加新的分区阶段:
SQL> insert into tmap (id_map, id_tab, id_part_stage)
2 values (seqmap.nextval, 1, 20);
1 row created.
结果:
SQL> select a.id_tab, a.description, a.status, p.description, ps.task
2 from table_1 a join tmap t on t.id_tab = a.id_tab
3 join part_stage ps on ps.id_part_stage = t.id_part_stage
4 join part p on p.id_part = ps.id_part
5 where a.id_tab = 1;
ID_TAB DESCRIPTION ST DESCRIPTION TASK
---------- -------------------- -- -------------------- --------------------
1 Test insert A1 0 - 5 build
1 Test insert A1 6 - 10 C
1 Test insert A1 16 - 20 Q
SQL>
看到了吗?我没有更改任何代码,没有更改任何表格......什么都没有。一切都正常。在您的数据模型中,您还有很多工作要做。
再一次考虑这样做。 正确的方式,在我看来。