我想构建一个函数,如果表中不存在电子邮件值并返回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但它不起作用。我有:
查询没有结果数据的目的地
基本上我的问题是:如何在 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重叠的最大值。
我正在尝试根据一组用户的 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) 我正在寻找一种用于pg_restore从转储文件恢复新创建的数据库的方法,但只能从该文件中恢复某些表。(数据库中有很多额外的表恢复速度很慢,我不关心。)
我首先尝试pg_restore使用-t/--table标志,但它没有启用这些表所需的扩展。没什么大不了的; 我可以psql -c "CREATE EXTENSION ..."在pg_restore命令之前手动运行。我更大的问题是该-t命令似乎跳过了与表相关的其他内容,例如约束和索引。
索引很烦人,但我可以运行pg_restore --list和使用awk/ grep/etc。获得索引列表,并将它们传递到pg_restore与-I/--index标志,所以这个过程将是(我认为):
pg_restore -t table1 -t table2 --schema-only ...pg_restore -I index1 -I index2 ...pg_restore -t table1 -t table2 --data-only ...但是(a)这仍然不会为我设置约束,并且(b)感觉就像我正在使用这个迂回的解决方案陷入困境,因为我认为这很简单。
我知道你可以告诉pg_dump只转储某些表,但我希望避免这种情况,因为转储我的数据库需要很长时间。
这是一个药品目录表。有些有药品品牌,有些是通用的(即他们永远不会有品牌信息)
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,有两种选择:
使用 NULL 作为外键 brand_id
INSERT INTO medicine (name, brand_id) VALUES ('abc', NULL)
INSERT INTO medicine (name, brand_id) VALUES ('xyz', NULL)
在品牌名称中仅插入 1 个空字符串,并将其用于所有仿制药的 Brand_id
INSERT INTO brand (id, name) VALUES (1, '')
INSERT INTO medicine (name, brand_id) VALUES …
我正在处理的应用程序根据状态和日期(按该顺序)显示一些任务。但是,对于特定状态,排序条件应该颠倒。例如,一个看起来像这样的表:
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) 我在 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) 我从 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. 那里没有文件。
我想允许用户取消定期订阅。考虑到我拥有的其他基础设施,最简单的方法是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) 我正在编写一个使用 postgres 的应用程序。每个微服务在数据库中使用自己的架构。
所以连接到我使用这个 jdbc 字符串的数据库模式:
jdbc:postgresql://${db.host}/${db.name}?currentSchema=${schema}
Run Code Online (Sandbox Code Playgroud)
这种工作原理,因此每个 sql 语句都可以使用架构内的表,而不会出现意外访问其他服务架构的危险。
但在一种模式中,我想使用地球距离扩展。我只设法在没有设置架构的情况下安装它,当我在没有 currentSchema 参数的情况下连接到数据库时,我可以访问 <@> 运算符来计算距离。但是使用参数 postgres 抱怨它无法找到运算符。
当我连接 currentSchema 参数时,有没有办法访问公共命名空间中的运算符?
我有点迷失在这里:-(
postgresql ×10
array ×1
concurrency ×1
foreign-key ×1
functions ×1
index ×1
index-tuning ×1
insert ×1
installation ×1
jdbc ×1
mac-os-x ×1
plpgsql ×1
range-types ×1
restore ×1
unaccent ×1