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) までのルーティング情報を保存しています。座標には固有のインデックスがあります。

ただし、データベースには、私を混乱させる 2 つのエントリがあります。

+----+----------+----------+---------+---------+----------+------------+
| 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

double の値がわずかに異なる可能性はありますが、4 桁目以降のみですか?
それらをエクスポートおよびインポートすると、それらは同じになり、一意の制約違反が発生します。

このMySQLバグレポートからの引用:

mysqldump が DOUBLE 値をダンプするとき、いくつかの近い値を区別するには不十分な精度を使用します (おそらく、元のデータベースから正確な値を再作成するには精度が不十分です)。DOUBLE 値が主キーまたは一意のインデックスの一部である場合、この出力からデータベースを復元すると、重複キー エラーで失敗します。

カンマの後ろの桁数を増やして表示してみてください (方法はクライアントによって異なります)。

于 2012-09-03T13:14:54.077 に答える