У меня есть таблица местоположений со связанными данными от нескольких поставщиков.У меня были идентификатор провайдера, широта и долгота (обе координаты double precision
) в качестве первичных ключей.Но теперь я бы хотел сгенерировать идентификатор типа varchar(50)
из провайдера, широты и долготы (обе координаты являются значениями двойной точности):
UPDATE mytable
SET id = CONCAT(provider, '-', latitude, '-', longitude)
Но когда я пытаюсь установитьновый столбец в качестве первичного ключа
ALTER TABLE mytable ADD PRIMARY KEY (id)
Я получаю ошибку
Key (id)=(2-53.69706-12.71236) is duplicated.
Оказывается, что действительно есть две записи с id='2-53.69706-12.71236'
, но только одна изих долгота 12,71236.Другой имеет долготу 12,71235999999999.И хотя я могу выбирать их по разным долготам:
SELECT
longitude,
to_char(longitude, '999D9999999999999999') AS longitude_to_char,
data->>'ID' AS id_within_provider
FROM mytable
WHERE provider=2 AND latitude=53.69706 AND longitude=12.71236
longitude | longitude_to_char | id_within_provider
12.71236 | 12.7123600000000 | 42266
SELECT
longitude,
to_char(longitude, '999D9999999999999999') AS longitude_to_char,
data->>'ID' AS id_within_provider
FROM mytable
WHERE provider=2 AND latitude=53.69706 AND longitude=12.71235999999999
longitude | longitude_to_char | id_within_provider
12.71236 | 12.7123600000000 | 84742
, выходная долгота остается неизменной, даже если я пытаюсь преобразовать ее в char с явной точностью.Как ни странно, to_char(12.71235999999999, '999D9999999999999999')
возвращает исходное число, а to_char(longitude, '999D9999999999999999')
всегда возвращает округленное число.
Итак, у меня есть два разных значения двойной точности, которые я не могу вывести по-другому, как онидолжно быть.Что я могу сделать?Я что-то не так делаю?