背景
我们正在将遗留应用程序从非关系型数据库迁移到 PostgreSQL。
问题
我们希望在许多字段上启用外键以实现未来的数据完整性,以便报告工具可以轻松确定哪些表已链接。某些当前数据无法通过 FK 检查,并且由于连接到数据库的旧应用程序,我们还无法打开 FK。
临时解决方案
一些程序员建议我们禁用数据库上的触发器,如此处所示,这样 FK 就不会被强制执行,但仍可用于报告工具。
题
我担心这会导致一系列其他意想不到的后果,但我不确定它们是什么。谁能消除我的恐惧或解释为什么这是一个非常糟糕的主意?我假设它不好的一个原因是它会禁用所有触发器,而不仅仅是触发 FK 约束的触发器。
我正在尝试对一些外部空间表执行查询,这比在普通空间表上运行的时间长几个数量级,因为没有使用索引。
索引似乎正在处理非空间查询。
这是应该工作的东西还是不受支持?
postgresql performance index spatial postgis query-performance
我有两个表:
create table animal
(
aid integer,
cid integer,
aname varchar(255) default NULL::character varying,
species text
);
create table daily_feeds
(
aid integer,
zid integer,
shift integer,
menu integer
);
Run Code Online (Sandbox Code Playgroud)
和一个查询:
SELECT
aname,
shift
FROM animal
NATURAL JOIN daily_feeds
WHERE menu = 1;
Run Code Online (Sandbox Code Playgroud)
餐桌动物包含大约 40000 行,表 daily_feeds 包含大约 80000 行,每只动物 2 行。
我认为在用于连接animal.aid和daily_feeds.aid的列上添加索引可能会导致不同的执行计划并提高性能。
create index aaid on animal (aid);
create index daid on daily_feeds using btree (aid);
Run Code Online (Sandbox Code Playgroud)
这不会发生。这是为什么?
显然,这是一个非常简单且学术性的示例,我试图用它来了解有关数据库查询优化的更多信息。
编辑:
添加没有索引时的执行计划:
Hash Join (cost=1439.24..2488.23 rows=499 width=10) …Run Code Online (Sandbox Code Playgroud) 我们有一个 Postgres 设置,其中包含多个表,代表项目的不同部分和阶段,目前有 4 个,但将来可能会更多。我们想要制作一个Task带有这些表中任何一个的外键的表。最好是这样的:
CREATE TABLE stage1(
id SERIAL PRIMARY KEY,
description TEXT);
CREATE TABLE stage2 (
id SERIAL PRIMARY KEY,
description TEXT);
CREATE TABLE stage4 (
id SERIAL PRIMARY KEY,
description TEXT);
CREATE TABLE task (
id SERIAL PRIMARY KEY,
description TEXT,
foreignkey_table VARCHAR(20),
foreignkey_id INTEGER);
Run Code Online (Sandbox Code Playgroud)
其中命名的列foreignkey_table可以指示“父”表,并且foreignkey_id将指示“父 ID”。
这些阶段 1 到 3 是为了使示例简单,但它们绝不能合并为一个。将它们视为“准备阶段”、“执行阶段”和“评估阶段”。或者作为完全不同的表格,如“用户”、“公司”和“活动”,每个表格都有自己特定的不重叠内容。
我怎样才能做到这一点?
我读过一些帖子,说这是不可能的,但它们已经很旧了,所以我希望在这些帖子之后实施解决方案。我还在Constraint for multiple foreign key上找到了一个潜在的解决方案,但它是互斥的 (PostgreSQL),这是我目前最好的后备选项。
我有一个用 Django 应用程序创建的 Postgres 数据库。当我转移它时,它从未重新索引任何内容,并且在尝试执行此操作时出现错误。似乎有很多表都有这个问题。有没有办法可以使用我在另一个问题中找到的这段代码并将其用于所有序列和表格?
SELECT setval('tablename_id_seq', (SELECT MAX(id) FROM tablename)+1)
Run Code Online (Sandbox Code Playgroud) 我是 Postgres 的新手,我意识到以前有人问过类似的问题,但是,我正在努力使这个查询工作:
SELECT p_search.id, count(kia.image_id) AS count
FROM (SELECT id,
keyword,
to_tsvector('english',keyword) AS tskw
FROM keyword) AS p_search
LEFT JOIN keyword_image_assoc AS kia
ON kia.keyword_id = p_search.id
WHERE p_search.tskw @@ plainto_tsquery('english','resident life')
OR p_search.tskw @@ plainto_tsquery('english','wofford')
GROUP BY kia.image_id
ORDER BY count desc
Run Code Online (Sandbox Code Playgroud)
对于上下文,我有三个表:
image其中有一个id作为主键keyword它具有id作为主键,keyword它是一个表示关键字的字符串keyword_image_assoc其中有一个id,image_id并且keyword_id它是用来关联图像和关键字规范地。如果我添加p_search.id到GROUP BY子句中,结果不正确 -count总是 1。有没有办法对结果进行分组,以便image_ids 具有匹配关键字的数量?
我正在寻找两列count- 匹配关键字的数量和 …
在 postgresql 中使用 ceil() 时,我发现它有一些奇怪的行为,请参阅 SQL :
Select
*,
ceil( (550*0.5)/100 ),
ceil( (58*5)/100 ),
FROM
XYZ
Run Code Online (Sandbox Code Playgroud)
如果我专注于 ceil 函数的输出,那就很奇怪了:
如果第二条语句接近更大的整数 3 ,为什么它返回 2 ?
我正在尝试使用来自程序命令的 Postgres 副本读取 JSON API。
当我打电话
copy _temp from program 'curl -uri "https://url"';
Run Code Online (Sandbox Code Playgroud)
它工作正常,但 API 有分页,我需要循环多次调用。
当我这样称呼它时:
_command := 'curl -uri "https://url?&page='||(10::text)||"';
copy _temp from program _command;`
Run Code Online (Sandbox Code Playgroud)
我得到
ERROR: syntax error at or near "_command"
Run Code Online (Sandbox Code Playgroud)
你甚至不能像
copy _temp from program 'curl -uri "https://url?&page='||(10::text)||'"';
Run Code Online (Sandbox Code Playgroud)
提高通知样式中的百分比参数替换也不起作用。
是什么赋予了?程序是带单引号的文字字符串,那么指定文字字符串和使用 text 或 varchar 变量有什么区别?似乎没有任何程序数据类型(::program cast 什么也不做),我错过了什么?
在文档中它说'最好使用固定的命令字符串'而不是你只能使用固定的命令字符串......
如何使用动态命令字符串?
我已经接管了一个使用 postgres 的系统。登录时,如果我使用...
sudo -u postgres psql postgres
Run Code Online (Sandbox Code Playgroud)
...它不要求输入密码。但是,如果我这样做...
psql -U postgres -h localhost postgres
Run Code Online (Sandbox Code Playgroud)
...它要求输入密码。
为什么?这种差异是如何配置的?是否可以为不同的用户配置以这种方式登录?
(注意:用户postgres不在sudoers文件中,也不在 sudo 组中。