小编Erw*_*ter的帖子

存储各种测量单位(kg、ml、mm、pl)的浮点值

我有一张如下表:

order_item
------------
serial      | id (PK)
integer     | order_id
????        | quantity
integer     | unit_of_measure_id (PK) --> ml, l, kg, mg, mm, m, etc.
Run Code Online (Sandbox Code Playgroud)

我正在做一个应用程序,我需要存储化学分析中使用的材料量。有时材料的用量很小,如微升,有时则更多,如一两升。

它的numeric数据类型是否足够好?

我读过将值转换为最小度量单位是个好主意。所以如果我有 10 升,我必须传递到 10000000 微升。但是,如果您将来需要使用更低的度量单位怎么办?像皮升?不可避免地,我认为应用程序将不得不使用浮点数。

postgresql database-design floating-point

5
推荐指数
1
解决办法
1677
查看次数

查询父表并获取子表列

我有两张表,一张继承了另一张:

CREATE TABLE parent (
    col1 INTEGER
);

CREATE TABLE child (
    col2 INTEGER
) INHERITS( parent );

// Insert some data
INSERT INTO parent( col1 ) VALUES( 1 );
INSERT INTO child( col1, col2 ) VALUES( 2, 2 );
Run Code Online (Sandbox Code Playgroud)

有什么方法可以查询父表,使其获取子表的所有列?

此查询仅返回父列:

SELECT * FROM parent;

| col1 |
| ---- |
| 1    |
| 2    |
Run Code Online (Sandbox Code Playgroud)

我想要的查询将返回父和子中的所有列:

SELECT ...  -- some query, with desired result:

| col1 | col2 |
| ---- | ---- |
| 1    | …
Run Code Online (Sandbox Code Playgroud)

postgresql database-design select inheritance

5
推荐指数
1
解决办法
9641
查看次数

跨表唯一

我有一个包含用户的表。每个用户都有一个主电子邮件和一个指示该用户是否被删除的标志(我们从不硬删除用户)。

但是,每个用户还可以拥有额外的电子邮件。

无论如何,电子邮件地址必须是唯一的,我想在数据库级别强制执行这一点。对于主要电子邮件地址来说这很简单。我可以简单地添加一个带有WHERE not is_deleted限制的 UNIQUE 索引,以便可以重新使用已删除的用户的电子邮件。

然而,对于辅助电子邮件来说,这就更加棘手。

  • 如果我将它们存储在数组字段中的同一个表中,我可能不仅会失去对它们进行索引的能力(我们有超过 5 万的用户,并且需要能够通过电子邮件进行搜索,所以这是不行的),而且到目前为止据我所知,我也不能将唯一的索引/约束放入数组中。
  • 如果我使用一个单独的表(这显然更干净),我必须将is_deleted用户的标志复制到该表,这也很丑陋,但允许我简单地使用 UNIQUE 索引与WHERE not is_deleted.

有没有更好的解决方案来实现我想要做的事情?

postgresql foreign-key database-design constraint unique-constraint

5
推荐指数
2
解决办法
6460
查看次数

删除主键而不删除索引

是否可以在不删除索引的情况下删除表上的主键约束?我有一种情况,我想删除PRIMARY KEY以摆脱NOT NULL约束并将其设置为另一个列对。我想避免删除和重新创建索引。可以只PRIMARY KEY删除索引上的“属性”吗?删除约束会删除索引。

我使用的是 PostgreSQL 9.1 版。

postgresql index primary-key ddl

5
推荐指数
1
解决办法
5466
查看次数

即使函数中止,也会在 UDF 中持久插入

我有一个相当复杂的 UDF(在一堆表中移动并创建一堆新表),其中可能会发生多次中止。在每次操作之前,我想记录操作发生的时间和查询本身。UDF 如下所示:

log function_start

log sql1
execute sql1

log sql2
execute sql2

...

log sqlN
execute sqlN

log function_end
Run Code Online (Sandbox Code Playgroud)

每条日志语句都意味着向下表中插入一条新记录:

CREATE TABLE backup_logs
(
  id serial NOT NULL,
  t timestamp with time zone default now(),
  sql text,
  CONSTRAINT backup_logs_pkey PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)

如果发生中止,我希望sql1, sql2, ... sqlN回滚,但inserto into backup_logs会继续存在。问题:我怎样才能实现这一目标?

postgresql insert transaction plpgsql postgresql-9.4

5
推荐指数
1
解决办法
1076
查看次数

选择具有某些条件的计数

使用 Postgres 9.4,我有一个page_views包含一page列的表。我想选择所有不同的页面并在它们之前进行计数并按降序对它们进行排序。我还希望在过去 24 小时内最少计数 20。所以它看起来像这样:

120 / home
 56 / about
 24 / locations
Run Code Online (Sandbox Code Playgroud)

我刚在想:

select count(*),page from page_views group by page where count(*) > 20;
Run Code Online (Sandbox Code Playgroud)

但这不起作用。这该怎么做?

postgresql aggregate postgresql-9.4

5
推荐指数
1
解决办法
104
查看次数

触发以创建对称行

我有一个表格,描述了两个项目之间的某种关系。项由 引用ID。我想创建一个触发器,所以每当你创建一行时(a,b),就会创建一个对称的行(b,a)。我试过在触发器之后创建,但它超过了堆栈深度,因为它在插入时调用了它自己。什么是正确的方法呢?

表看起来有点像这样:

CREATE TABLE MY_RELATION(
ID SERIAL,
THING1 INT NOT NULL,
THING2 INT NOT NULL,
PRIMARY KEY (ID)
);

CREATE TABLE MY_THING(
ID SERIAL,
VAL INT NOT NULL
PRIMARY KEY(ID)
);
ALTER TABLE MY_RELATION ADD FOREIGN KEY (THING1) REFERENCES MY_THING(ID);
ALTER TABLE MY_RELATION ADD FOREIGN KEY (THING2) REFERENCES MY_THING(ID);
Run Code Online (Sandbox Code Playgroud)

postgresql trigger database-design

5
推荐指数
1
解决办法
408
查看次数

PostgreSQL UNIQUE 约束错误消息

附录 A:PostgreSQL 错误代码中,它说:

对于某些类型的错误,服务器会报告与错误关联的数据库对象(表、表列、数据类型或约束)的名称;例如,导致 unique_violation 错误的唯一约束的名称。此类名称在错误报告消息的单独字段中提供,以便应用程序无需尝试从消息的可能本地化的人类可读文本中提取它们。

大胆强调我的。我有下表:

CREATE TABLE recipes (
    id SERIAL,
    title TEXT UNIQUE NOT NULL,
    description TEXT NOT NULL,
    instructions TEXT NOT NULL,
    image BYTEA,
    CONSTRAINT recipes_pk PRIMARY KEY(id),
    CONSTRAINT title_unique UNIQUE(title)
);
Run Code Online (Sandbox Code Playgroud)

当我尝试插入具有重复标题的新行时,我在 pgAdmin3 中收到以下错误消息:

ERROR:  duplicate key value violates unique constraint "title_unique"
DETAIL:  Key (title)=(mytitle) already exists.
Run Code Online (Sandbox Code Playgroud)

或者,使用 PHP:

["errorInfo"]=>
  array(3) {
    [0]=>
    string(5) "23505"
    [1]=>
    int(7)
    [2]=>
    string(117) "ERROR:  duplicate key value violates unique constraint "title_unique"
                 DETAIL:  Key (title)=(mytitle) already exists." …
Run Code Online (Sandbox Code Playgroud)

postgresql php error-handling unique-constraint

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

如何在 PostgreSQL 中旋转

表中有以下数据:

ID     Category   Value
1234   Cat01      V001
1234   Cat02      V002
1234   Cat03      V003
1234   Cat03      V004
1234   Cat03      V005
Run Code Online (Sandbox Code Playgroud)

我想要以下输出:

ID     Cat01  Cat02   Cat03
1234   V001   V002    V003
1234   V001   V002    V004
1234   V001   V002    V005
Run Code Online (Sandbox Code Playgroud)

我想要实现的输出是一种数据透视表,其中我将所有值垂直放置在一个表中,并且我希望将这些值水平放置,并将类别作为列。但是有些类别具有多个值,在这种情况下,我需要重复所有其他类别的值并为每个重复值创建一行

如何在 PostgreSQL 中完成?

postgresql pivot

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

查询同一行的 Min、Max 和关联列数据

我有一个查询,其中按站点和月份返回平均值。我想知道的是按站点划分的月平均值的最小值和最大值以及(困难的部分)每个发生的月份。

这是一个例子:

SQL Fiddle 的东西在这里

CREATE TABLE events (
    esite     integer NOT NULL,
    edate     timestamp with time zone NOT NULL,
    evalue    integer NOT NULL
);

INSERT INTO events Values
    (1, '2016-01-03', 11),
    (2, '2016-01-05', 90),
    (1, '2016-01-08', 7),
    (2, '2016-01-10', 40),
    (1, '2016-01-15', 12),
    (1, '2016-01-18', 66),
    (2, '2016-01-22', 54),
    (2, '2016-02-03', 70),
    (2, '2016-02-05', 56),
    (1, '2016-02-08', 61),
    (2, '2016-02-10', 23),
    (1, '2016-02-15', 30),
    (1, '2016-02-18', 15),
    (1, '2016-02-22', 41);
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个查询,该查询返回(按站点)最小和最大月平均值evalue以及最小和最大值发生的月份。我可以通过使用下面的查询得到这个:

SQL 摆弄这个

select esite, date_trunc('month', edate) …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate greatest-n-per-group postgresql-9.4

5
推荐指数
1
解决办法
1585
查看次数