Oracle以外のデータベースのパラレルReplicatの制限
親の主キーに関連付けられた外部キー列索引の順序が異なると、パレルReplicatが失敗します。これは、親にコンポジット主キーがある場合にパラレルReplicatが異常終了し、子表でそれを参照している外部キーの順序が主キーと異なることを意味します。
たとえば:
CREATE TABLE atstgt.tgt (
pk1 VARCHAR(10) NOT NULL,
pk2 VARCHAR(20) NOT NULL,
num INT,
) PRIMARY KEY(pk1, pk2);
CREATE TABLE atstgt.child (
id INT NOT NULL,
pk2 VARCHAR(10) NOT NULL,
pk1 VARCHAR(20) NOT NULL,
details VARCHAR(100),
CONSTRAINT fk_child FOREIGN KEY (pk1, pk2) REFERENCES atstgt.tgt (pk1, pk2) ON DELETE CASCADE ON UPDATE CASCADE) PRIMARY KEY(id);
この例では、親の主キー(atstgt.tgt)の位置1にpk1、位置2にpk2があります。ただし、子表では序数位置が逆になり、pk1序数位置3はpk2's序数位置2の後になります。これにより、パラレルReplicatでROW NOT FOUNDエラーが発生して断続的に障害が発生します。
このような問題を回避するには、次の例に示すように、親表のコンポジット主キー列の順序と比較すると、外部キー列の索引が子表で同じ順序になるようにします。
CREATE TABLE atstgt.tgt (
pk1 VARCHAR(10) NOT NULL,
pk2 VARCHAR(20) NOT NULL,
num INT,
) PRIMARY KEY(pk1, pk2);
CREATE TABLE atstgt.child (
id INT NOT NULL,
pk1 VARCHAR(10) NOT NULL,
pk2 VARCHAR(20) NOT NULL,
details VARCHAR(100),
CONSTRAINT fk_child FOREIGN KEY (pk1, pk2) REFERENCES atstgt.tgt (pk1, pk2) ON DELETE CASCADE ON UPDATE CASCADE) PRIMARY KEY(id);