PostgreSQL 查询更新 returns 更新 0

PostgreSQL query update returns UPDATE 0

我在使用 PostgreSQL 查询时遇到问题,我的更新条件包含更多先决条件。

我附上了 2 张图片来描述我的问题。

我想更新突出显示的行

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

但响应是:

UPDATE 0 Query returned successfully in 58 msec.

永远不要假设您看到的小数位就是存储在 table 中的确切数字。

在你的情况下,只有 idprof_id 足以更新行(正如我从附件中看到的),因此,不需要 latlong,但是如果您在更新期间被迫使用十进制数字进行比较(我会争辩说,如果是这种情况,您的数据库设计不佳 tables),请始终将它们四舍五入为可控小数点如下:

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

您的问题可能出在其他地方(请参阅此 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 的 kickass 函数,使处理地理空间数据变得非常简单和高效。一开始它可能看起来很复杂,但相信我,它肯定会在长期 运行!
  • 中得到回报