标签: postgresql

REFERENCES 特权仅与创建外键约束有关?实际用例?

今天我了解了GRANT REFERENCES. 在多年的 SQL 管理和开发工作中,我从未听说过它,也从未遇到过问题。

引用自MySQL 5.7 参考手册/GRANT 语法

REFERENCES 启用外键创建。级别:全局、数据库、表、列。

引用自PostgreSQL 9.6 / GRANT

REFERENCES 要创建外键约束,必须对引用列和被引用列都具有此权限。可以为表的所有列或仅特定列授予特权。

GRANT REFERENCES唯一的有关创建一个外键约束?在什么业务案例中禁止创建外键约束(但允许创建表)有意义?你能给我举个真实世界的例子吗?

mysql postgresql foreign-key permissions referential-integrity

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

日期范围中数组的元素?

我有一个日期数组,我想知道数组中的任何元素是否出现在给定的日期范围内。

例如(伪代码 - 不起作用,为了可读性而包装):

SELECT ARRAY['2017-01-01'::DATE, '2017-02-03'::DATE] && 
    daterange('2017-01-01', '2017-01-31', '[]');
Run Code Online (Sandbox Code Playgroud)

这个例子试图展示(虽然它不起作用)是我的日期数组和日期范围之间的值之间是否存在重叠。

理想情况下,我可以用集合来做,并确定两者之间是否存在联合,但似乎不可能将 daterange 对象转换为任何东西。

我确实设法让这个工作,但我不知道如何随后减少行:

SELECT daterange('2017-01-01', '2017-01-31', '[]') @> 
    unnest(ARRAY ['2017-01-01' :: DATE, '2016-07-30' :: DATE]);
Run Code Online (Sandbox Code Playgroud)

这将返回多行:

?column?
----------
 t
 f
(2 rows)
Run Code Online (Sandbox Code Playgroud)

有没有人对此有任何指示?任何帮助表示赞赏。

postgresql array range-types

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

如果在事务中间插入数据会发生什么?

我是数据库的新手,我对交易迷路了。例如,在我有一个sensor_log不断接收 INSERT的表的情况下,我想在一个事务中将数据移动到另外两个表。

BEGIN;

INSERT INTO sensor_log_a
SELECT id, location 
FROM sensor_log
INNER JOIN sensor_location_to_insert USING (location);

INSERT INTO sensor_log_b
SELECT id, location 
FROM sensor_log
INNER JOIN sensor_location_to_insert USING (location);

COMMIT;
Run Code Online (Sandbox Code Playgroud)

如果在事务期间插入数据或BEGIN;..COMMIT;防止这种情况发生,是否存在数据在 sensor_log_a 和 sensor_log_b 之间不同的风险?

postgresql

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

Postgres:将一个表中的不同值插入到另一个带有约束的表中

我试图在删除重复条目的同时将数据从一个 PostgreSQL 9.3 表插入到另一个表。

我有两个包含电子邮件地址的表。

主表包含电子邮件和每个电子邮件地址的标签。组合(email, tag)必须是唯一的,为此有一个限制Unique(email, tag)

第二个表是从仅包含电子邮件地址的文本文件中动态创建的。那里有很多重复。

我需要将临时表中的数据导入主表而不破坏上述约束。对于包含电子邮件地址的特定文件,标签是恒定的。

表结构:

CREATE TABLE emails (   
  email character varying(128),
  tag bigint,
  CONSTRAINT "unique-tag-email" UNIQUE (email, tag) )
Run Code Online (Sandbox Code Playgroud)

CREATE TABLE emails_temp (email character varying(128)
Run Code Online (Sandbox Code Playgroud)

这是我的查询:

insert into emails(tag,email) 
select 
 655,t.email 
from 
 emails_temp as t 
where 
 not exists ( select email from emails where email = t.email )
Run Code Online (Sandbox Code Playgroud)

注意:655 只是某组电子邮件地址的标记。

这是我得到的错误:

错误:重复键值违反唯一约束“唯一标签电子邮件”SQL 状态:23505 详细信息:密钥(电子邮件,标签)=(user@hotmail.com,655)已经存在。

文件中确实有两个电子邮件地址 user@hotmail.com。

废话不多说,因为这个错误,主表(email)里什么都没有添加。

我究竟做错了什么?

postgresql constraint distinct

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

使用 DELETE 或 TRUNCATE 释放磁盘空间?

一个多星期前,我删除了 postgresql 表中的所有行(不是通过truncate,而是使用delete from ...)。Select count (*)显示表行现在为 0。

当我现在运行查询来查询磁盘空间时,我仍然看到该表占用了空间。具体来说,所有索引仍然存在并且正在占用空间。如何摆脱它们并释放磁盘空间?其次,当我摆脱了所有行时,为什么它们仍然留在首位?


以下是表格的详细说明,以防万一:

                                      Table "public.links_photoobjectsubscription"
     Column     |           Type           |                                 Modifiers                                  
----------------+--------------------------+----------------------------------------------------------------------------
 id             | integer                  | not null default nextval('links_photoobjectsubscription_id_seq'::regclass)
 viewer_id      | integer                  | not null
 updated_at     | timestamp with time zone | not null
 seen           | boolean                  | not null
 type_of_object | character varying(15)    | not null
 which_photo_id | integer                  | 
 which_link_id  | integer                  | 
 which_group_id | integer                  | 
 which_salat_id | integer                  | 
Indexes:
    "links_photoobjectsubscription_pkey" …
Run Code Online (Sandbox Code Playgroud)

postgresql delete truncate

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

Postgres 错误:元组同时更新

我有一个大表测试,其中 user_id 2 有 500000 条记录。所以我想以 100 条记录为单位删除这条记录,但出现错误。这是我的查询:

delete from test where test_id in (select test_id
from test where User_id = 2 limit 100 )
Run Code Online (Sandbox Code Playgroud)

错误:元组同时更新

这是什么问题。我怎样才能解决它。

postgresql postgresql-9.0

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

SQL查询以查找子记录是特定集合的所有父记录

一个 Item 有许多 ItemDetails。ItemDetail 具有“type”、“value”和“item_id”字段。

当且仅当项目具有受某些可变条件限制的确切ItemDetails 时,我才需要找到所有项目。例如,我需要查找 ItemDetails 为 (type=10, value=1000) 和 (type=20 and value=2000) 的所有项目

我的第一个解决方案是这样的:

select p.*
from item p 
where not exists 
    ( 
      select c.id from item_detail c
      where c.item_id=p.id
      and (c.type<>10 or c.value<>1000)
      and (c.type<>20 or c.value<>2000)
    );
-- Execution Time: 17.819 ms
Run Code Online (Sandbox Code Playgroud)

但我意识到它只获取一个 ItemDetail(type=10, value=1000) 的项目。然后我发现了这个问题并改变了如下查询。

select p.*
from item p 
where not exists 
    ( 
      select c.id from item_detail c
      where c.item_id=p.id
      and (c.type<>10 or c.value<>1000)
      and (c.type<>20 or c.value<>2000) …
Run Code Online (Sandbox Code Playgroud)

postgresql relational-division

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

Postgres 9.6.1 大多数口语的全文搜索词典

使用Mac OSX 10.10.5优山美地,我试图运行全文搜索的操作,如to_tsvectorto_tsquery等,并有需要的字典中约80+语言。

Postgres 似乎只有 16 种语言配置,另外两个我正在测试中文(jiebacfgtestzhcgaka ZHParse)。我正在寻找文档或除这些之外的其他语言的存储库。

mydatabase=# \dF

               List of text search configurations
   Schema   |    Name    |              Description              
------------+------------+---------------------------------------
 pg_catalog | danish     | configuration for danish language
 pg_catalog | dutch      | configuration for dutch language
 pg_catalog | english    | configuration for english language
 pg_catalog | finnish    | configuration for finnish language
 pg_catalog | french     | configuration for french language
 pg_catalog | german     | configuration for german language …
Run Code Online (Sandbox Code Playgroud)

postgresql full-text-search postgresql-9.6

5
推荐指数
0
解决办法
4412
查看次数

按顺序插入和聚类效果一样吗?

我有一个表,其中包含一些基于其他表的预先计算的数据。(考虑到我必须处理的数据大小,动态计算的计算成本太高。)随着源数据的添加,我将逐步生成。(UPDATE在正常使用中我永远不需要它;部分可能会被删除和重新生成。)该表将相当大。它目前大约有 5000 万行,并且每年都会增长。

对该表的大多数查询都将通过外键 ID 列进行过滤。因此,如果该 ID 的所有行都分组到相同的页面中,它们的性能会更好。我可以通过创建索引和CLUSTER定期调用来保证磁盘上的这种排序,但这显然不太理想,因为它需要某种计划任务,根据使用情况和其他计划任务进行协调等。

但是,由于我以与我想要使用的外键相关的块的形式生成这些数据CLUSTER,因此我可以轻松地ORDER BYINSERT命令中添加一个子句:

INSERT INTO big_table (source_table1_id,a,b,c)
SELECT
   source_table1_id,
   5 /* some formula */,
   /* ... */
FROM source_table1
JOIN source_table2 ON ...
...
WHERE ... /* some condition indicating what needs to be generated */
ORDER BY source_table1_id
Run Code Online (Sandbox Code Playgroud)

这是否会影响磁盘存储顺序,将行分组为接近最小页数?如果确实如此,是否还有其他进程可能会在以后弄乱磁盘顺序?

我目前正在使用 PostgreSQL 9.3,但我想了解更新的版本以及升级。

postgresql performance

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

当索引扫描会更好时,为什么 PostgreSQL 选择慢速 Seq 扫描?

我在 Postgres 9.6 DB 中有以下表格:

create table baseDimensions(
    id serial not null primary key,
    dimension1 date not null,
    dimension2 int not null,
    dimension3 text not null,
    -- ...
    dimension10 boolean not null,
    unique(dimension1, dimension2, ..., dimension10)
);

create table interestingData(
    baseDimensionId int not null references baseDimensions(id),
    subdimension1 int not null,
    subdimension2 boolean not null,
    -- ...
    value1 int not null,
    value2 bigint not null,
    -- ...
    primary key(baseDimensionId, subdimension1, subdimension2)
)
Run Code Online (Sandbox Code Playgroud)

所以在文本中:我有很多维度(例如,如果表格用于零售店的销售,则维度可以是销售日期、customerId、客户是否是重复客户、客户的夹克颜色穿着等)以及这些尺寸的一些值(例如,保持零售示例:值可以是客户支付的金额)。然而,有多个“interestingData”表共享十个基本维度,因此为了节省一些磁盘空间,我将这些基本维度提取到一个单独的表中。

我特意选择了唯一索引中列的顺序,以便典型的过滤条件在最左边。所以大部分时间我会按维度1过滤数据。

现在我想知道value1特定日期的平均值(dimension1每个dimension3)。这可以通过以下查询来回答: …

postgresql performance optimization postgresql-9.6 query-performance

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