сценарий, который дает пример того, что может быть достаточно для иметь одну таблицу в качестве родительский элемент для нескольких таблиц [это показывает две дочерние таблицы, каждая из которых имеет идентичны ВСТАВИТЬ TRIGGER], через которые каждый из них будет иметь следующее значение последовательности, назначенное от просто одного, таким образом совместно ПОСЛЕДОВАТЕЛЬНОСТИ. Родитель будет, конечно, получить все значения последовательности, и каждый ребенок получит только те значения, которые не в какой-либо другой дочерней таблице:
drop table AppFile01 ;
drop table AppFile02 ;
drop table Master_IDENTITY ;
drop sequence ID_SEQ ;
create table Master_IDENTITY
(Master_ID BIGINT NOT NULL
, constraint Master_IDENTITY_PK
PRIMARY KEY (Master_ID)
)
;
CREATE SEQUENCE ID_SEQ AS BIGINT
START WITH 10000 INCREMENT BY 1
NO MAXVALUE NO CYCLE CACHE 100
;
create table AppFile01
(sKeyAF BIGINT not null
, ts timestamp default current timestamp
, constraint AppFile01_PK
PRIMARY KEY (sKeyAF)
, constraint AppFile01_FK
FOREIGN KEY (sKeyAF)
REFERENCES Master_IDENTITY (Master_ID)
ON DELETE CASCADE ON UPDATE NO ACTION
)
;
create trigger AppFile01_BI BEFORE INSERT
on AppFile01
referencing new as N
for each row mode db2sql
begin
declare NxtSeq BIGINT ;
set NxtSeq = NEXT VALUE FOR ID_SEQ ;
insert into Master_IDENTITY values (NxtSeq) ;
set N.sKeyAF = NxtSeq ;
end
;
create table AppFile02
(sKeyAF BIGINT not null
, ts timestamp default current timestamp
, constraint AppFile02_PK
PRIMARY KEY (sKeyAF)
, constraint AppFile02_FK
FOREIGN KEY (sKeyAF)
REFERENCES Master_IDENTITY (Master_ID)
ON DELETE CASCADE ON UPDATE NO ACTION
)
;
create trigger AppFile02_BI BEFORE INSERT
on AppFile02
referencing new as N
for each row mode db2sql
begin
declare NxtSeq BIGINT ;
set NxtSeq = NEXT VALUE FOR ID_SEQ ;
insert into Master_IDENTITY values (NxtSeq) ;
set N.sKeyAF = NxtSeq ;
end
;
И следующие запросы как тестовые и показать эффект; нет особых причин, я решил использовать буквенное значение -1
над, например, DEFAULT
:
insert into AppFile01 values(-1, DEFAULT) ;
; -- gets value 10000
insert into AppFile02 values(-1, DEFAULT)
, (-1, DEFAULT)
; -- gets values 10001 and 10002
insert into AppFile01 values(-1, DEFAULT) ;
; -- gets value 10003
select * from master_id
; -- likeness of report from above query
MASTER_ID
10,000
10,001
10,002
10,003
select * from appfile01
; -- likeness of report from above query
SKEYAF TS
10,000 2016-10-09-18.38.28.347468
10,003 2016-10-09-18.38.28.400702
select * from appfile02
; -- likeness of report from above query
SKEYAF TS
10,001 2016-10-09-18.38.28.372121
10,002 2016-10-09-18.38.28.386622
Почему вы хотите сделать это? Я имею в виду, что для каждого первичного ключа единственная последовательность не выглядит для меня хорошей идеей, так как это будет горячая точка. – MichaelTiefenbacher
Я хотел бы иметь единственный уникальный идентификатор для всех объектов. Кроме того, разработчики никогда не могут вставлять неправильные внешние ключи (другие pk таблицы) в таблицы, поскольку ключи существуют только один раз. – JMX
Во-первых, ваша функция _not_ детерминирована, потому что она никогда не может вернуть одно и то же значение. Но это не имеет значения - весь ваш подход кажется неправильным. – mustaccio