【问题标题】:Avoid duplicate rows, without reference to keys or indexes?避免重复行,而不参考键或索引?
【发布时间】:2023-03-19 18:27:01
【问题描述】:

我有一个 MySQL 表,其中每一行都是一个电视剧集。它看起来像这样:

     showTitle  |  season   |  episode   |  episodeTitle  |  airdate  |  absoluteEpisode
 ----------------------------------------------------------------------------------------
 The X-Files          5          12          Bad Blood     1998-02-22         109
 The X-Files          5          13          Patient X     1998-03-01         110

(其中absoluteEpisode 是从第 1 集开始计算的剧集总数。)

它是使用我编写的从 Web 服务获取数据的 Ruby 程序填充的。定期,我想再次运行该程序以获取新剧集。那么问题就变成了,如何避免添加已经存在的行的重复项?此表中的所有列都不适合用作主键或唯一字段。

我有两个想法。第一个是创建一个新列md5,其中包含所有这些值的 MD5 哈希,并使其成为唯一列,以防止添加具有相同数据的两行。这似乎可行,但会很混乱。

我的第二个是使用this solution from StackOverflow。但我不能让它发挥作用。我的 SQL 查询是

INSERT INTO `tv`.`episodes` (showTitle,episodeTitle,season,episode,date,absoluteEpisode) 
SELECT '#{show}','#{title}','#{y['airdate']}' FROM `tv`.`episodes`
WHERE NOT EXISTS (SELECT * from `tv`.`episodes` 
WHERE showTitle='#{show}' AND episodeTitle='#{title}' AND season='#{season_string}' AND episode='#{y['seasonnum']}' AND date='#{y['airdate']}' AND absoluteEpisode='#{y['epnum']}'")

#{...} 位是 Ruby 变量。这让我发现了明显的错误You have an error in your SQL syntax

翻阅我可以找到的有关该主题的书籍和文档,我仍然不确定如何正确执行此查询,或者它是否不是解决我的问题的明智方法。我会很感激任何建议!

【问题讨论】:

  • 你的问题中的完整错误信息是什么
  • 除了使用所有相关值的md5,您还可以在所有这些字段的组合上添加单个唯一索引。
  • (showTitle, season, episode) 看起来可以用作主键或唯一键。 (showTitle, absoluteEpisode) 也是。

标签: mysql sql database


【解决方案1】:

为什么不从showTitle、季节和剧集创建一个主键,这将解决问题,因为我猜是因为同一季下的剧集号不能重复,并且适用于同一电视节目, 例子

x-files==>第 1 季==>第 1 集,这将是一个单元的主键

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    相关资源
    最近更新 更多