【问题标题】:Update table column primary key based on mapping table根据映射表更新表列主键
【发布时间】:2016-12-09 10:17:22
【问题描述】:

我有两张桌子。

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

有什么问题?

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

我已尝试选择必须重新映射的所有记录的计数,但我不知道我的查询是否正确。

这是这两张表:

select * from temp_1;
select * from temp_2;

这是带有计数的选择:

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

样本数据:

表 1:
1、2、3、4、5、40、50

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

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

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

【问题讨论】:

  • 您能否更新您的问题,告诉我们您使用的是哪个版本的 SQL(例如 MySQL、SQL Server 等)以及示例数据?
  • @TimBiegeleisen 标题为 ORACLE
  • @FDavidov 抱歉...我没有看到任何标签
  • @Luke 。 . .我想我理解这个问题,但样本数据和期望的结果会有所帮助。
  • 我在我的问题中添加了示例数据

标签: sql oracle mapping


【解决方案1】:

因此,您有表 1 的列 A,其中包含的值也可能作为重新映射的新值出现。唯一的解决方案是使用一个临时表,将新映射部署到其中,完成后,将新映射复制到表 1。

【讨论】:

  • 也许这是一个解决方案,也许它甚至是最好的解决方案,但它肯定不是唯一的解决方案。例如,可以删除 PK 约束。或者,如果约束是用 DEFERRABLE 定义的,它可以被推迟(并在所有工作完成后重新施加)。
  • 问题不在于密钥的唯一性。问题如下:您有一个字段“A”= 10 的记录和另一个字段“A”= 20 的记录。当您获得第一条记录的新值时,您将获得 20。现在,当您获得第二条记录是 40。现在您想将“A”值为 20 的记录更新为 40。您将错误地更新两条记录。
  • 是的,你是对的,可能还有其他解决方案,但我的直觉告诉我不要花精力去寻找它们。
  • ??更新不是那样工作的。 10 的值将被 20 覆盖,20 的值将变为 40。更新后的值不应有“第二遍”。除非我误解了 OP 想要做什么。
  • @mathguy,你会写update tablename set A = (select from other table) where A(或B)= <something>。问题是 A 的新值可能与另一行中 A 的现有值发生冲突。诚然,如果您在 A 上具有唯一性,则更新将失败,但目的不是避免重复,而是将 A 的所有值替换为新值。
【解决方案2】:

这不是答案 - 作为一个答案发布,以便可以格式化查询。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 2011-12-04
    相关资源
    最近更新 更多