MySQL Merged表重复

时间:2013-01-08 17:36:37

标签: mysql merge duplicates

以下是我目前的情况:

归档表(每年一个,2008-2011)和4个新创建的2012年表分为几个季度。所有这些表,包括新表,都具有相同的结构和键。这些命名约定是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:

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;

1 个答案:

答案 0 :(得分:1)

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

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