重复密钥更新的SQL更新

时间:2012-01-30 22:53:54

标签: mysql sql database-design

我问了这个问题Grouping and update large database table,但我没有得到答案。

我有一张桌子:name, date, detail, noname, date, detail和PK一起。

不知何故,我需要更新detail,并且可能存在重复的密钥。因此,我需要对重复行的no求和。 ON DUPLICATE KEY UPDATE仅用于INSERT。那么如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

首先,多列主键可能是一个坏主意;正如你所发现的那样,它很难操纵各个领域。你应该做的是在该表中添加一个autoincrement bigint列,它将成为你的新主键,而你的三列唯一性约束可以是一个唯一的索引。它应该表现得更好......但它也可以让你做你需要的那种操作。它会让你执行修改,但仍然可以通过整数索引识别原始行。

如果您这样做,只要您不介意创建一些临时表,就可以安全地完成“一次性更新”。像这样:

创建一些具有相同架构的临时表,但没有唯一三列索引 - 您可以拥有一个非唯一索引,因为它可以帮助您查询执行;

将您需要处理的记录复制到第一个表中(包括唯一的整数主键);

更新临时表中需要更新的所有detail列;

INSERT ... SELECTSUMGROUP BY一起使用,将这些记录合并到第二个表格中;

INSERT INTO temp2 (...whatever...) SELECT ...whatever..., SUM(no) FROM temp1 GROUP BY ...whatever...

最后,从原始表中删除temp1表中的所有记录(使用整数主键),并将temp2表中的记录插入到原始表中。

答案 1 :(得分:0)

糟糕的设计。您应该使用surrogate id主键并使这些字段成为复合唯一索引。如果你想稍后引用这个表,你会有什么? 3个额外的字段作为另一个表中的外键和一个额外的大索引。您将如何更新详细信息字段?如果你在它之前说过一个大表,那就意味着PK索引重建了。如果可能,如果未引用约束,则禁用约束。从源表中选择distinct或group by,然后使用此选择进行更新。


REPLACE EDIT:

  REPLACE INTO table(name,date,detail)
  select distinct name,date,(select distinict detail from table) from 
  table
相关问题