【发布时间】: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)也是。