【问题标题】:MySQL Merged table duplicatesMySQL合并表重复
【发布时间】:2012-12-22 15:39:49
【问题描述】:

这是我目前拥有的:

存档表格(2008-2011 年每年一个)和 2012 年新创建的 4 个表格,按季度划分。所有这些表,包括新表,都具有相同的结构和键。这些的命名约定是 ARCHIVE_PLAYS。然后我有一个用于当前数据的“实时”表(称为 PLAYS)。我有一个合并表,它结合了所有表,以便我可以运行报告。我以前没有的问题是这个合并表显示重复。它们具有相同的主键,所以不应该是这种情况,对吧?一定是和我刚刚创建的新表有关,因为我之前没有遇到过这个问题。

结构:

**COMPANY**
      COMPANY.MERGED_PLAYS
      COMPANY.ARCHIVE_PLAYS_2008
      COMPANY.ARCHIVE_PLAYS_2009
      COMPANY.ARCHIVE_PLAYS_2010
      COMPANY.ARCHIVE_PLAYS_2011
      COMPANY.ARCHIVE_PLAYS_2012Q1
      COMPANY.ARCHIVE_PLAYS_2012Q2
      COMPANY.ARCHIVE_PLAYS_2012Q3
      COMPANY.ARCHIVE_PLAYS_2012Q4

**COMPANY2**
      COMPANY2.PLAYS

除了 Merged_Plays 之外,每个表都有以下创建:

CREATE TABLE `ARCHIVE_PLAYS_2011` (
`ENTRY_ID` BIGINT(20) NOT NULL,
`NODE_ID` VARCHAR(48) NOT NULL,
`HW_ID` VARBINARY(64) NOT NULL,
`LOG_DAY` DATE NOT NULL,
`ROW_NUMBER` INT(11) NOT NULL,
`NODE_NAME` VARCHAR(128) NOT NULL,
`FILE_NAME` VARCHAR(1024) NOT NULL,
`PRESENTATION_NAME` VARCHAR(1024) NULL DEFAULT NULL,
`SMIL_SEQUENCE_ID` VARCHAR(256) NULL DEFAULT NULL,
`SMIL_CONTENT_ID` VARCHAR(256) NULL DEFAULT NULL,
`PLAY_TIME_MS` BIGINT(20) NOT NULL,
`PLAY_TIME` TIME NOT NULL,
`STATUS_CODE` VARCHAR(48) NULL DEFAULT NULL,
`NUM_SCREENS_CONNECTED_AND_ON` INT(11) NULL DEFAULT NULL,
`NUM_SPEAKERS_CONNECTED_AND_ON` INT(11) NULL DEFAULT NULL,
`SCREEN_LAYOUT_MATCHES` CHAR(1) NULL DEFAULT NULL,
`ENTRY_PROCESSED` CHAR(1) NULL DEFAULT NULL,
`FILE_PATH` VARCHAR(1024) NULL DEFAULT NULL,
PRIMARY KEY (`NODE_ID`, `LOG_DAY`, `ROW_NUMBER`),
INDEX `PLAYLOG_ENTRY_ID` (`ENTRY_ID`),
INDEX `PLAYLOG_LOG_DAY` (`LOG_DAY`),
INDEX `PLAYLOG_LOG_DAY_PLAY_TIME` (`LOG_DAY`, `PLAY_TIME`),
INDEX `PLAYLOG_FILE_NAME` (`FILE_NAME`(600)),
INDEX `PLAYLOG_NODE_NAME` (`NODE_NAME`),
INDEX `PLAYLOG_FILE_NAME_NODE_NAME` (`FILE_NAME`(600), `NODE_NAME`),
INDEX `PLAYLOG_ENTRY_ID_PROCESSED` (`ENTRY_ID`, `ENTRY_PROCESSED`)
  )
    COLLATE='latin1_swedish_ci'
    ENGINE=MyISAM;

【问题讨论】:

  • 如果不查看 DDL 并知道如何将数据传输到存档表以及如何管理主键,就很难说。主键只保证在表中是唯一的。
  • 我从以前的存档表之一中获取了创建表代码来制作每个表。然后我从 PLAYS 中做了一个 INSERT 语句,并使用 BETWEEN 来获取该季度的日期。

标签: mysql merge duplicates


【解决方案1】:

主键仅确保单个表中的数据具有唯一性。您必须有跨多个表的重复记录。确保您已从实时表中删除了所有 2012 年的数据。确保任何四分之一桌之间没有重复。

此外,如果记录是 100% 重复,如果您在所有表之间执行 UNION(而不是 UNION ALL),您将获得唯一的结果,但这会降低查询性能。

【讨论】:

  • 谢谢。当然,这个想法是从活动表中删除 2012,但我不想这样做,直到我确定所有数据都已备份和存档。
  • 如果您没有从实时表中删除 2012 年的数据,这可以解释为什么您有重复数据。难道 2012 年季度表中的所有数据都不在实时表中吗?
  • 正确。我对 MySQL 比较陌生,当我从这里开始时,我继承了所有这些表。我的印象是我不会有骗子,因为有一个原始的 2012 年存档表是 1 月至 7 月,当我几个月前对其进行查询时没有它们。我猜它的结构不同,或者合并的表实际上没有包含它。
猜你喜欢
  • 2012-09-25
  • 2012-07-15
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 2014-09-08
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多