我有下表,我想问一个关于坐标检查约束的问题。
create table places
(
id bigint generated always as identity
constraint pk_places
primary key,
name varchar(128) not null,
address varchar(256) not null,
region_name varchar not null
constraint fk_places_region_name_regions
references regions
on update cascade on delete restrict,
coordinates geography(Point, 4326)
为了防止在表中插入错误的坐标,我进行了以下检查约束:
alter table places
add check (
abs(ST_X(coordinates::geometry)) <= 90 and abs(ST_Y(coordinates::geometry)) <= 180
);
它确实有效,但对我来说,它似乎很可疑,因为:
1.嗯,地理类型POINT
,考虑到行星地球应该有纬度和经度的限制,分别为90/180度。但事实并非如此。也许这是任何方式如何打开它的地方也许?
1.在我的检查约束中,我需要将地理转换为几何。也许地理学有什么天生的功能来获得经度和纬度?
1.限制地理坐标值有更好的解决方案吗?
比你多。
1条答案
按热度按时间jtoj6r0c1#
以防止插入错误的坐标
这不可能。如果我告诉你我在奇诺,那就错了。因为我不在那里。但除非你已经知道我在哪里(在这种情况下,我为什么要告诉你?),你就不会知道它是错的--这是一个有效的地方,某人可以在。检查约束可以(可能)防止无效坐标,但不能防止仅仅是错误的坐标。
它确实有效,但对我来说
对我没用。首先,你把x和y颠倒了,所以你不允许一半的有效经度,而允许无效的纬度。另一方面,在检查约束得到它之前,点被类型输入机器规范化,所以“搭接地球”的点在被检查时将被转换为有效的。