我们已经将mysql(percona)从5.6更新到了5.7,我们被告知有些表需要修改/修复,因为'datetime'字段现在不同了。尽管在两个字段、设备id和ts上都有主键,但更改表失败并出现重复条目错误,并且所有数据看起来都正常(没有重复项)。据我所知,主键也必须是唯一的。
我们尝试在where部分中按“device\u id”和“ts”条件选择重复条目,它只找到记录的一个示例。当我们尝试仅按ts字段选择时,它会找到相同记录的2个示例。这怎么可能?那些复制品是什么?钥匙坏了吗?除了创建一个新表并用insert ignore在其中传递所有数据之外,还有其他方法吗?
编辑:错误如下:
ERROR 1062 (23000): Duplicate entry '486-2014-10-26 02:39:33' for key 'PRIMARY'
编辑2:表格结构如下(设备id、ts和32个传感器):
CREATE TABLE IF NOT EXISTS `sensor_log` (
`device_id` int(11) NOT NULL,
`ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`D1` smallint(6) DEFAULT NULL,
`D2` smallint(6) DEFAULT NULL,
...
`D30` smallint(6) DEFAULT NULL,
`D31` smallint(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
/*!50100 PARTITION BY RANGE ( UNIX_TIMESTAMP(ts))
(PARTITION p_sl_2013 VALUES LESS THAN (1388530800) ENGINE = InnoDB,
PARTITION p_sl_2014 VALUES LESS THAN (1420066800) ENGINE = InnoDB,
PARTITION p_sl_2015 VALUES LESS THAN (1451602800) ENGINE = InnoDB,
PARTITION p_sl_2016 VALUES LESS THAN (1483225200) ENGINE = InnoDB,
PARTITION p_sl_2017_q1 VALUES LESS THAN (1490997600) ENGINE = InnoDB,
PARTITION p_sl_2017_q2 VALUES LESS THAN (1498860000) ENGINE = InnoDB,
PARTITION p_sl_2017_q3 VALUES LESS THAN (1506808800) ENGINE = InnoDB,
PARTITION p_sl_2017_q4 VALUES LESS THAN (1514761200) ENGINE = InnoDB,
PARTITION p_sl_2018_q1 VALUES LESS THAN (1522533600) ENGINE = InnoDB,
PARTITION p_sl_2018_q2 VALUES LESS THAN (1530396000) ENGINE = InnoDB,
PARTITION p_sl_2018_q3 VALUES LESS THAN (1538344800) ENGINE = InnoDB,
PARTITION p_sl_2018_q4 VALUES LESS THAN (1546297200) ENGINE = InnoDB,
PARTITION p_sl_2019_q1 VALUES LESS THAN (1551394800) ENGINE = InnoDB,
PARTITION p_sl_2019_q2 VALUES LESS THAN (1556661600) ENGINE = InnoDB,
PARTITION p_sl_2019_q3 VALUES LESS THAN (1561932000) ENGINE = InnoDB,
PARTITION p_sl_2019_q4 VALUES LESS THAN (1567288800) ENGINE = InnoDB,
PARTITION p_sl_2019_q5 VALUES LESS THAN (1572562800) ENGINE = InnoDB,
PARTITION p_sl_2019_q6 VALUES LESS THAN (1577833200) ENGINE = InnoDB,
PARTITION p_sl_X VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */;
--
-- Indexes for table `sensor_log`
--
ALTER TABLE `sensor_log`
ADD PRIMARY KEY (`device_id`,`ts`);
1条答案
按热度按时间yks3o0rb1#
当错误看起来像这样时:
然后您可能尝试用相同的名称创建两次外键。或者类似的。检查外键。
如果要强制将表更新为新格式,则不必对表进行任何更改。就这么做吧
编辑:
表中有重复项。您的主键跨越两列。找那些有
然后您必须清理表,确保每个设备的\u id和ts组合只存在一个条目。