根据映射 table 更新 table 列主键

Update table column primary key based on mapping table

我有两个 table。

  1. table 包含具有 A 列(类型编号,主键)的记录。
  2. table 包含具有列 A、B(类型编号)的记录。第二个表示映射 table.

问题是什么?

我需要重新映射 table 1 中的所有记录,特别是基于映射 table 2 的 A 列到 B 列。 但问题是 table 1 包含的记录也具有 table 2 中的值 B(在 A 列中)。这意味着当我重新映射 table 1 时,可能会出现唯一性问题,因为 table 1 中的 A 列是主键。

我已经尝试 select 计算所有必须重新映射的记录,但我不确定我的查询是否正确。

这是那两个 table:

select * from temp_1;
select * from temp_2;

这里是 select 计数:

SELECT count(*) FROM temp_1 T1
WHERE EXISTS (SELECT 1 FROM temp_2 T2 WHERE T2.a = T1.a
and not exists (select 1 from temp_1 T1b where T2.b = T1b.a));

示例数据:

Table 1:
1, 2, 3, 4, 5, 40, 50

Table 2:
1-11、2-22、3-33、4-40、5-50

重映射后结果Table1:
11、22、33,4、5、40、50 剩余问题值

如果你理解我的话,这些粗体标记的值就是问题值。

因此,您的 table 1 的 A 列包含的值也可能显示为重新映射中的新值。唯一的解决方案是使用临时 table 部署新映射,完成后,将新映射复制到 table 1.

这不是答案 - 统一发帖以便查询可以格式化。

您可能需要检查 PK 约束是否可延迟。例如,您可以 运行 下面的查询。 '......' 表示您的 table 姓名,用单引号括起来(并且全部大写)。如果 table 不是您的,请查询 ALL_CONSTRAINTS 而不是 USER_CONSTRAINTS。如果幸运的话,约束是可延迟的。如果没有,我们可以考虑其他解决方案。祝你好运!

select constraint_name, deferrable, deferred
from   user_constraints
where  constraint_type = 'P'
  and  table_name = '.....'