非 Oracle 数据库的并行复制的限制

与父级主键关联的外键列索引的排序不同,会导致 parelle 复制失败。这意味着在父级具有组合主键的情况下,并行复制会异常终止,这样,当子表中引用它的外键的顺序位置与主键不同时。

例如:

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 之后。这会导致并行复制中出现间歇性故障,出现 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);