今天我了解了GRANT REFERENCES. 在多年的 SQL 管理和开发工作中,我从未听说过它,也从未遇到过问题。
REFERENCES 启用外键创建。级别:全局、数据库、表、列。
REFERENCES 要创建外键约束,必须对引用列和被引用列都具有此权限。可以为表的所有列或仅特定列授予特权。
是GRANT REFERENCES唯一的有关创建一个外键约束?在什么业务案例中禁止创建外键约束(但允许创建表)有意义?你能给我举个真实世界的例子吗?
mysql postgresql foreign-key permissions referential-integrity
我有一个日期数组,我想知道数组中的任何元素是否出现在给定的日期范围内。
例如(伪代码 - 不起作用,为了可读性而包装):
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)
有没有人对此有任何指示?任何帮助表示赞赏。
我是数据库的新手,我对交易迷路了。例如,在我有一个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 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 表中的所有行(不是通过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) 我有一个大表测试,其中 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)
错误:元组同时更新
这是什么问题。我怎样才能解决它。
一个 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) 使用Mac OSX 10.10.5优山美地,我试图运行全文搜索的操作,如to_tsvector,to_tsquery等,并有需要的字典中约80+语言。
Postgres 似乎只有 16 种语言配置,另外两个我正在测试中文(jiebacfg和testzhcgaka 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) 我有一个表,其中包含一些基于其他表的预先计算的数据。(考虑到我必须处理的数据大小,动态计算的计算成本太高。)随着源数据的添加,我将逐步生成。(UPDATE在正常使用中我永远不需要它;部分可能会被删除和重新生成。)该表将相当大。它目前大约有 5000 万行,并且每年都会增长。
对该表的大多数查询都将通过外键 ID 列进行过滤。因此,如果该 ID 的所有行都分组到相同的页面中,它们的性能会更好。我可以通过创建索引和CLUSTER定期调用来保证磁盘上的这种排序,但这显然不太理想,因为它需要某种计划任务,根据使用情况和其他计划任务进行协调等。
但是,由于我以与我想要使用的外键相关的块的形式生成这些数据CLUSTER,因此我可以轻松地ORDER BY在INSERT命令中添加一个子句:
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,但我想了解更新的版本以及升级。
我在 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
postgresql ×10
performance ×2
array ×1
constraint ×1
delete ×1
distinct ×1
foreign-key ×1
mysql ×1
optimization ×1
permissions ×1
range-types ×1
truncate ×1