Как предотвратить PostgreSQL от округления вывода значений двойной точности? - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть таблица местоположений со связанными данными от нескольких поставщиков.У меня были идентификатор провайдера, широта и долгота (обе координаты 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') всегда возвращает округленное число.

Итак, у меня есть два разных значения двойной точности, которые я не могу вывести по-другому, как онидолжно быть.Что я могу сделать?Я что-то не так делаю?

1 Ответ

0 голосов
/ 17 декабря 2018

Попытка отформатировать значения двойной точности в уникальные значения varchar практически невозможна.Короче говоря, вы сражаетесь в проигрышной битве.

Ясное решение здесь заключается в использовании составного первичного ключа:

ALTER TABLE mytable ADD PRIMARY KEY (provider, latitude, longitude)

В качестве альтернативы вы можете использовать столбец SERIAL в качестве основногои добавьте уникальное ограничение для этих столбцов (хотя я не понимаю, почему).

...