У меня возникли проблемы с запросом postgresql, в котором мое условие обновления содержит дополнительные требования. Можете ли вы помочь мне в том, что я делаю неправильно? Спасибо.

Я прикрепил 2 изображения, чтобы описать мою проблему.

Я хочу обновить выделенную строку

UPDATE locations
SET lat = 48.20325265836398, long = 16.34969524923078
WHERE prof_id = 58 AND lat = 47.5327567434237 AND long = 21.6292262077332

Но ответ таков:

ОБНОВЛЕНИЕ 0 Запрос успешно возвращен через 58 мсек.

1
Tamás Tényi 28 Фев 2021 в 14:06

2 ответа

Лучший ответ

Ваша проблема может быть в другом месте (см. db<>fiddle)

CREATE TEMPORARY TABLE locations (
id INT, prof_id INT, lat NUMERIC, long NUMERIC);

INSERT INTO locations VALUES 
(57,58,47.5327567434237,21.6292262077332);

UPDATE locations SET lat = 48.20325265836398, long = 16.34969524923078 
WHERE prof_id = 58 AND lat = 47.5327567434237 AND long = 21.6292262077332;

SELECT * FROM  locations;

 id | prof_id |        lat        |       long        
----+---------+-------------------+-------------------
 57 |      58 | 48.20325265836398 | 16.34969524923078
(1 Zeile)

Несколько мыслей о ваших данных:

  • Уменьшите level of precision своих координат. С 13 десятичными знаками вы находитесь в области микрон, что не очень полезно в приложениях для определения местоположения. Как видите, такой уровень точности делает запросы = довольно сложными.
  • Рассмотрите возможность использования PostGIS для хранения ваших координат. Он имеет более 1.3k функций, которые делают работу с геопространственными данными очень простой и эффективной. Поначалу это может показаться сложным, но поверьте мне, в долгосрочной перспективе это обязательно окупится!
1
Jim Jones 28 Фев 2021 в 11:46

Никогда не предполагайте, что отображаемые десятичные разряды - это точное число, хранящееся в таблице.

В вашем случае для обновления строки достаточно только id или prof_id (как я вижу из вложений), поэтому нет необходимости в lat и long, однако в случаях, когда вы вынуждены использовать десятичные числа для сравнения во время обновления (и я буду спорить, если это так, у вас плохой дизайн таблиц базы данных), всегда округляйте их до контролируемой десятичной точки следующим образом:

UPDATE locations SET 
       lat = 48.20325265836398, 
       long = 16.34969524923078 
WHERE  prof_id = 58 
       AND ROUND(lat,13) = 47.5327567434237 
       AND ROUND(long,13) = 21.6292262077332
0
jordanvrtanoski 28 Фев 2021 в 11:31