我正在使用PostgreSQL 11和PostGIS 2.5.1,并尝试在现有表中创建具有特定值的新列
示例表如下:
CREATE TABLE test (id integer, geom GEOMETRY);
INSERT INTO test (id, geom)
VALUES
(1, ST_GeomFromEWKT('SRID=4326;POINT(-71.00 42.00)')),
(2, ST_GeomFromEWKT('SRID=4326;POINT(52.00 52.00)'));
如果我创建一个新列并执行insert into语句,结果将类似于笛卡尔积
ALTER Table test
ADD wkt_text TEXT;
INSERT INTO test (wkt_text)
SELECT st_astext(a.geom)::text FROM test a, test b
WHERE a.id = b.id;
结果如下:
SELECT * FROM test;
id | geom | wkt_text
----+----------------------------------------------------+---------------
1 | 0101000020E61000000000000000C051C00000000000004540 |
2 | 0101000020E61000000000000000004A400000000000004A40 |
| | POINT(-71 42)
| | POINT(52 52)
为什么会这样?对于具有空列的表,Insert into可以正常工作。一旦有一个用值填充的列,结果就是所描述的。
通过以下查询我得到了正确的结果,但我想了解原因。
WITH subquery AS (
SELECT id, st_astext(geom)::text AS wkt_text
FROM test
)
UPDATE test
SET wkt_text=subquery.wkt_text
FROM subquery
WHERE test.id = subquery.id;
答案 0 :(得分:1)
INSERT
将新的行插入表中。为INSERT
中未指定的列提供了NULL
值(或指定的默认值)。
UPDATE
更新现有行中的列。这似乎是您想要的逻辑,并且您有正确的陈述。