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);