我正在为索引、主键和外键苦苦挣扎……并且需要拥有所有这些。
如果我有两个表,它们都有一个整数作为主键。
第一个表通过 FK 引用第二个表的主键。
table1.ref_field
引用第二个表 ( table2.id
)的 PK上创建了 FK 约束table1.ref_field
这是组织这些索引、主键和外键的最佳方式吗?
我遇到了一个我无法解决的奇怪问题。服务器在执行一些 postgis 相关查询时崩溃。一些调试后,使用实例 提供由PostGIS的,它出现在ST_GEOMFROMGeoJSON()
函数引起服务器崩溃。
崩溃:
SELECT ST_AsText(ST_GeomFromGeoJSON('{"type":"Point","coordinates":[-48.23456,20.12345]}')) As wkt;
Run Code Online (Sandbox Code Playgroud)
运行正常:
SELECT ST_AsText(
ST_Transform(
ST_GeomFromText('POLYGON((743238 2967416,743238 2967450,
743265 2967450,743265.625 2967416,743238 2967416))',2249)
,4326)
) As wgs_geom;
Run Code Online (Sandbox Code Playgroud)
查看日志时,我发现这些条目与崩溃相关:
2014-11-21 11:27:46 CET LOG: server process (PID 2377) was terminated by signal 11: Segmentation fault
2014-11-21 11:27:46 CET DETAIL: Failed process was running: SELECT ST_AsText(ST_GeomFromGeoJSON('{"type":"Point","coordinates":[-48.23456,20.12345]}')) As wkt;
2014-11-21 11:27:46 CET LOG: terminating any other active server processes
2014-11-21 11:27:46 CET WARNING: terminating connection because of crash of another server process
2014-11-21 …
Run Code Online (Sandbox Code Playgroud) 我有两个对象的一些数据,我想检索两个对象的最后一行,最好是在一个查询中。
表结构:
CREATE TABLE data
(
pid serial NOT NULL,
dt timestamp without time zone,
object_id integer,
info_1 numeric(10,8),
speed numeric,
CONSTRAINT dat_pid PRIMARY KEY (pid)
)
Run Code Online (Sandbox Code Playgroud)
样本数据:
1, 2014-04-29 12:02:56, 8, ....
2, 2014-04-29 12:02:10, 8, ....
3, 2014-04-29 12:01:02, 8, ....
5, 2014-04-29 12:01:32, 6, ....
.....
Run Code Online (Sandbox Code Playgroud)
我想要每个唯一的对象 ID 一行,每一行都是可用的最新行。我试图通过使用此查询来实现它,但它希望 pid 位于 group by 子句中。但我不想按 PID 分组,而是按跟踪器 ID 分组....
SELECT *
FROM data
GROUP BY object_id
Run Code Online (Sandbox Code Playgroud) 我有一个大表(约 900 万行),想将包含年份的字段上的行分组。到目前为止,这很容易:
// greatly simplified:
SELECT count(*), year FROM dataset GROUP BY year ORDER BY 2;
Run Code Online (Sandbox Code Playgroud)
我们定义了一些跨越多年的不规则时间段:
<1945, 1946-1964, 1965-1974, 1975-1991, 1992-2005 and >2005
Run Code Online (Sandbox Code Playgroud)
我不知道如何在 group by 子句中对这些结果进行分组。我可以为每个时间段创建子查询。
SELECT
( SELECT count(*) FROM dataset WHERE year <= 1945 AND ...... ) AS pre1945,
( ....) AS period2,
....
FROM dataset
Run Code Online (Sandbox Code Playgroud)
但这感觉不对,我想知道是否可以让 Postgresql 做到这一点。特别是因为该查询是对实际查询的极大简化:它有多个条件,其中包括一个跨越四个表的 ST_within 子句。因此,选择子查询方法会导致查询变得臃肿。
有没有更好的方法来创建这个结果?