小编stU*_*Urb的帖子

需要外键索引

我正在为索引、主键和外键苦苦挣扎……并且需要拥有所有这些。

如果我有两个表,它们都有一个整数作为主键。
第一个表通过 FK 引用第二个表的主键。

  • 在两个表上,我在 ID 列上都有一个主键索引
  • 我在table1.ref_field引用第二个表 ( table2.id)的 PK上创建了 FK 约束
  • 我在上面添加了一个索引 table1.ref_field

这是组织这些索引、主键和外键的最佳方式吗?

postgresql index foreign-key database-design primary-key

37
推荐指数
1
解决办法
3万
查看次数

ST_GeomFromGeoJSON() 导致 postgres 崩溃

我遇到了一个我无法解决的奇怪问题。服务器在执行一些 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)

postgresql spatial postgis postgresql-9.3

7
推荐指数
1
解决办法
649
查看次数

分组并显示每个结果最后一行的内容

我有两个对象的一些数据,我想检索两个对象的最后一行,最好是在一个查询中。

表结构:

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)

postgresql group-by postgresql-9.1 greatest-n-per-group

4
推荐指数
1
解决办法
1万
查看次数

按年份范围分组

我有一个大表(约 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 子句。因此,选择子查询方法会导致查询变得臃肿。

有没有更好的方法来创建这个结果?

postgresql

4
推荐指数
2
解决办法
4566
查看次数