我在服务器上有以下表格:
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不应该拒绝它们吗?
答案 0 :(得分:2)
双值是否可能略有不同,但仅在第4位之后?
如果您导出和导入它们,它们将是相同的,这将导致唯一的约束违规。
当mysqldump转储DOUBLE值时,它使用的精度不足 区分一些接近的价值(并且,可能是不充分的 精度从原始数据库重新创建确切的值)。如果 DOUBLE值是主键或唯一索引的一部分,还原 此输出中的数据库因重复键错误而失败。
尝试使用逗号后面的更多数字显示它们(具体取决于您的客户端。)