标签: postgresql

插入或选择后返回id

我想构建一个函数,如果表中不存在电子邮件值并返回email_id行的值,则该函数将插入电子邮件。我怎样才能做到这一点?
另外,如果电子邮件没有插入并且它已经存在于数据库中,我该如何返回 ID?我需要执行另一个SELECT吗?

BEGIN;
  LOCK TABLE mailing_list IN SHARE ROW EXCLUSIVE MODE;
  INSERT INTO mailing_list (email)
  SELECT 'email'
   WHERE NOT EXISTS (
     SELECT * FROM mailing_list WHERE email='email'
   );
COMMIT;
Run Code Online (Sandbox Code Playgroud)

我试过添加,returning id但它不起作用。我有:

查询没有结果数据的目的地

Sqlfiddle

postgresql insert concurrency plpgsql postgresql-9.3

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

重叠范围的最大 sum()

基本上我的问题是:如何在 PostgreSQL 9.3(或 9.4)中进行涉及重叠范围的聚合操作?我手头的具体问题是,给定一个范围,我想找到适用重叠范围的最大 sum()。一个简单的例子:

create table event (
  event_id int primary key,
  event_type_id int not null,
  period tstzrange not null,
  quantity int not null
);

insert into event (event_id, event_type_id, period, quantity) values
(1, 1,'[2016-01-06 09:00:00+00,2016-01-08 17:00:00+00]',1),
(2, 1,'[2016-01-07 09:00:00+00,2016-01-07 11:00:00+00]',1),
(3, 1,'[2016-01-07 13:00:00+00,2016-01-07 17:00:00+00]',1),
(4, 2,'[2016-01-07 12:00:00+00,2016-01-07 17:00:00+00]',1);
Run Code Online (Sandbox Code Playgroud)

给定具有以下子句的查询:

select ... 
where event_type_id = 1
and period && '[2016-01-07 00:00:00+00,2016-01-07 23:59:00+00]'::tstzrange 
group by event_type_id
Run Code Online (Sandbox Code Playgroud)

期望的结果是:3,即在给定时间戳范围内sum(quantity)相同范围event_type_id重叠的最大值。

postgresql window-functions postgresql-9.3 range-types

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

如何在 postgresql 中执行 =ANY(SELECT...query?

我正在尝试根据一组用户的 id 在另一个表中存储的数组中选择他们的所有纬度和经度。这是我的尝试:

SELECT latitude, longitude 
FROM userloc WHERE id = ANY( SELECT interested FROM donedeals WHERE deals_id=67);
Run Code Online (Sandbox Code Playgroud)

但它给了我以下错误:

ERROR:  operator does not exist: integer = integer[]
LINE 1: SELECT latitude, longitude FROM userloc WHERE id = ANY( SELE...
                                                         ^
HINT:  No operator matches the given name and argument type(s).
       You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)

donedeals有一int列 fordeals_id和一int array列 for interested,其中包含与 的 id 列对应的 id userloc,该列存储纬度和经度:

 deals_id |  interested …
Run Code Online (Sandbox Code Playgroud)

postgresql array

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

pg_restore 仅某些表

我正在寻找一种用于pg_restore从转储文件恢复新创建的数据库的方法,但只能从该文件中恢复某些表。(数据库中有很多额外的表恢复速度很慢,我不关心。)

我首先尝试pg_restore使用-t/--table标志,但它没有启用这些表所需的扩展。没什么大不了的; 我可以psql -c "CREATE EXTENSION ..."pg_restore命令之前手动运行。我更大的问题是该-t命令似乎跳过了与表相关的其他内容,例如约束和索引。

索引很烦人,但我可以运行pg_restore --list和使用awk/ grep/etc。获得索引列表,并将它们传递到pg_restore-I/--index标志,所以这个过程将是(我认为):

  1. pg_restore -t table1 -t table2 --schema-only ...
  2. pg_restore -I index1 -I index2 ...
  3. pg_restore -t table1 -t table2 --data-only ...

但是(a)这仍然不会为我设置约束,并且(b)感觉就像我正在使用这个迂回的解决方案陷入困境,因为我认为这很简单。

我知道你可以告诉pg_dump只转储某些表,但我希望避免这种情况,因为转储我的数据库需要很长时间。

postgresql restore postgresql-9.3

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

外键 NULL 与外键到空字符串

这是一个药品目录表。有些有药品品牌,有些是通用的(即他们永远不会有品牌信息)

CREATE TABLE medicine (
   id serial PRIMARY KEY,
   name text NOT NULL,
   brand_id integer
   CONSTRAINT brand_fk FOREIGN KEY (brand_id) REFERENCES brand (id)       
);

CREATE TABLE brand (
  id serial PRIMARY KEY,
  name text NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

对于存储仿制药,例如abc& xyz,有两种选择:

  1. 使用 NULL 作为外键 brand_id

    INSERT INTO medicine (name, brand_id) VALUES ('abc', NULL)
    INSERT INTO medicine (name, brand_id) VALUES ('xyz', NULL)

  2. 在品牌名称中仅插入 1 个空字符串,并将其用于所有仿制药的 Brand_id

    INSERT INTO brand (id, name) VALUES (1, '')
    INSERT INTO medicine (name, brand_id) VALUES …

postgresql foreign-key database-design unique-constraint

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

查询的自定义排序

我正在处理的应用程序根据状态和日期(按该顺序)显示一些任务。但是,对于特定状态,排序条件应该颠倒。例如,一个看起来像这样的表:

 id    | status   | planned_date
-------+----------+--------------
 1     | inactive | 2015-03-12
 2     | active   | 2015-03-13
 3     | inactive | 2015-03-13
 4     | inactive | 2015-03-14
 5     | active   | 2015-03-12
 6     | active   | 2015-03-16
 7     | active   | 2015-03-17
Run Code Online (Sandbox Code Playgroud)

应该返回为

 id    | status   | planned_date
-------+----------+--------------
 5     | active   | 2015-03-12
 2     | active   | 2015-03-13
 6     | active   | 2015-03-16
 7     | active   | 2015-03-17
 4     | inactive | 2015-03-14
 3     | inactive | 2015-03-13
 1 …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.3

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

在创建索引期间“错误:文本搜索字典“unaccent”不存在?

我在 Mac OS X Yosemite 上运行 PostgreSQL 9.3。

我尝试创建一个非重音小写三元组索引。为了实现它,我这样做了:

mydb=# CREATE EXTENSION pg_trgm SCHEMA public VERSION "1.1"; 
       CREATE EXTENSION unaccent SCHEMA public; 
       ALTER FUNCTION unaccent(text) IMMUTABLE;
CREATE EXTENSION
CREATE EXTENSION
ALTER FUNCTION
Run Code Online (Sandbox Code Playgroud)

然后我尝试创建索引:

mydb=# CREATE INDEX author_label_hun_gin_trgm ON address 
       USING gin (public.unaccent(lower(label_hun)) gin_trgm_ops);
ERROR:  text search dictionary "unaccent" does not exist
Run Code Online (Sandbox Code Playgroud)

...并得到这个错误。如果我尝试列出可用的文本搜索词典,该unaccent词典似乎就在那里:

mydb=# \dFd
                             List of text search dictionaries
   Schema   |      Name       |                        Description                        
------------+-----------------+-----------------------------------------------------------
 pg_catalog | danish_stem     | snowball stemmer for danish language
 pg_catalog | dutch_stem      | …
Run Code Online (Sandbox Code Playgroud)

postgresql index index-tuning functions unaccent

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

全新安装后得到 `psql: command not found`

从 KyngChaos下载并安装了PostgreSQL 和 PostGIS,用于我的 OS X 10.10 安装。当我跑步时,psql我得到,

bash: psql: command not found
Run Code Online (Sandbox Code Playgroud)

根据网站如何在 Mac OS X 上运行 psql?它被安装到/Library/PostgreSQL. 那里没有文件。

postgresql installation mac-os-x postgresql-9.4

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

Postgres 9.3:除了其他选择标准之外,如何更新具有时间戳最大值的行?

我想允许用户取消定期订阅。考虑到我拥有的其他基础设施,最简单的方法是recurring为用户的最新约会(日期)设置字段 = 0。所以我只需要recurring在匹配特定用户的最新约会的行中更新字段的值。

这是我尝试过的:

UPDATE appointments SET recurring = 0 WHERE id = 433 AND time = max(time);


ERROR:  aggregate functions are not allowed in WHERE
LINE 1: ...ments set recurring = 0 where id = 433 and time = MAX(time);
Run Code Online (Sandbox Code Playgroud)

 UPDATE appointments SET recurring = 0 WHERE id = 433 AND time = SELECT MAX(time) FROM appointments WHERE id = 433;
Run Code Online (Sandbox Code Playgroud)

这是约会表的相关部分:

                                           Table "public.appointments"
      Column      |            Type             |                           Modifiers
------------------+-----------------------------+----------------------------------------------------------------
 id               | integer                     | …
Run Code Online (Sandbox Code Playgroud)

postgresql

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

通过架构内的扩展添加的访问运算符

我正在编写一个使用 postgres 的应用程序。每个微服务在数据库中使用自己的架构。

所以连接到我使用这个 jdbc 字符串的数据库模式:

jdbc:postgresql://${db.host}/${db.name}?currentSchema=${schema}
Run Code Online (Sandbox Code Playgroud)

这种工作原理,因此每个 sql 语句都可以使用架构内的表,而不会出现意外访问其他服务架构的危险。

但在一种模式中,我想使用地球距离扩展。我只设法在没有设置架构的情况下安装它,当我在没有 currentSchema 参数的情况下连接到数据库时,我可以访问 <@> 运算符来计算距离。但是使用参数 postgres 抱怨它无法找到运算符。

当我连接 currentSchema 参数时,有没有办法访问公共命名空间中的运算符?

我有点迷失在这里:-(

postgresql jdbc postgresql-9.4

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