0

我在服务器上有下表:

CREATE TABLE routes (
  id          int(11) unsigned NOT NULL AUTO_INCREMENT,
  from_lat    double NOT NULL,
  from_lng    double NOT NULL,
  to_lat      double NOT NULL,
  to_lng      double NOT NULL,
  distance    int(11) unsigned NOT NULL,
  drive_time  int(11) unsigned NOT NULL,

  PRIMARY KEY (id),
  UNIQUE KEY route (from_lat,from_lng,to_lat,to_lng)
) ENGINE=InnoDB;

我们正在保存从 A 点 (from_lat, from_lng) 到 B 点 (to_lat, to_lng) 的一些路由信息。坐标上有唯一的索引。

但是,数据库中有两个条目让我感到困惑:

+----+----------+----------+---------+---------+----------+------------+
| id | from_lat | from_lng | to_lat  | to_lng  | distance | drive_time |
+----+----------+----------+---------+---------+----------+------------+
| 27 | 52.5333  | 13.1667  | 52.5833 | 13.2833 | 13647    | 1125       |
| 28 | 52.5333  | 13.1667  | 52.5833 | 13.2833 | 13647    | 1125       |
+----+----------+----------+---------+---------+----------+------------+

它们完全相同。

当我不尝试使用导出数据库mysqldump并尝试重新导入它时,出现错误:

ERROR 1062 (23000): Duplicate entry '52.5333-13.1667-52.5833-13.2833' for key 'route'

当它们上有唯一键时,这怎么可能在数据库中?MySQL不应该拒绝它们吗?

4

1 回答 1

2

双精度值是否可能略有不同,但仅在第 4 位之后?
如果您导出和导入它们,它们将是相同的,这将导致违反唯一约束。

引用此 MySQL 错误报告

当 mysqldump 转储一个 DOUBLE 值时,它使用的精度不足以区分一些接近的值(并且可能是精度不足,无法从原始数据库重新创建确切的值)。如果 DOUBLE 值是主键或唯一索引的一部分,则从此输出还原数据库失败并出现重复键错误。

尝试在逗号后面显示更多数字(如何取决于您的客户。)

于 2012-09-03T13:14:54.077 回答