如何列出指向给定表中特定行的所有外键(表 + 列 + pk-of-that-row)。
示例:表“用户”具有 PK '1234' 的行。
我想查看所有指向这个 ID 为“1234”的用户的 FK。
我使用 PostgreSQL 12.8。
如何列出指向给定表中特定行的所有外键(表 + 列 + pk-of-that-row)。
示例:表“用户”具有 PK '1234' 的行。
我想查看所有指向这个 ID 为“1234”的用户的 FK。
我使用 PostgreSQL 12.8。
我们的 Django 测试变得越来越慢,很多时间都花在cursor.execue()
.
现在大致有两种方法:重写测试以模拟 ORM,或者使 PostgreSQL 更快。
这个问题是关于“让 PostgreSQL 更快”。
如果 ACID 的 D (Durability) 不重要,我能做些什么来提高 PostgreSQL 的速度。一切都可以保存在 RAM 中。
约束:这个问题是关于你可以在不修改 Django/Python/SQL 代码的情况下做什么。
想象一下,你有一个餐饮服务,每天都有不同的顾客可以点餐。
Mon, Dec 12: Pasta
Tue, Dec 13: Pizza
Wed, Dec 14: Gnocci
上午 9 点前可下单。
这意味着客户可以在周一上午 8 点订购今天的意大利面,但在上午 9 点 15 分,他们不再被允许订购今天的面食。
如何处理这个问题是使用 PostgreSQL。
我看到两种方法:
是否有可行的第三种或第四种方式?
哪种方式简单而健壮?
我知道有几种符号可以表示实体之间的基数。
但是有没有一种务实的通用方式来表达 ascii 中的基数?
示例:用户 -- 组。一个用户可以有多个组,一个组可以有多个用户。
我查看了此页面:https://en.wikipedia.org/wiki/Cardinality_(data_modeling)
例如:一对多“订单”←→“订单项”
以下是一些表达基数的图形方式:
https://en.wikipedia.org/wiki/Entity%E2%80%93relationship_model#Cardinalities
表示基数的最常用方法是什么?
这有标准/ rfc吗?
我想创建一个表,其中有一列名为“方向”。
此列是“in”或“out”。它不可为空,并且只能包含这两个值。从来没有其他值。
哪种数据类型最可行?
我在 PostgreSQL 中使用。如果数据类型是特定于 PG 的(仅此数据库实现已知),则 100% 可以。
如果你只看数据库,一切都很好。你有交易,如果出现问题,一切都会回滚。很好-我喜欢这个。
但是:我想发送邮件。现在我有麻烦了,因为我无法回滚。
例子:
如何解决这个问题是一个不同的问题,而不是这个。
这个问题一般怎么称呼这个。在这个例子中是关于发送邮件。但是,一旦您在事务边界之外的系统中修改某些内容,就会出现同样的问题。
这个问题有名字吗?
如果您想从目录导入文件,则会出现大致相同的问题。如果您在事务中删除文件,则事务可能会失败并且文件已被删除但从未导入。或者您在交易后删除文件。然后文件的删除可能会失败,并且文件会被第二次导入。
我不想为此重新发明解决方案。这就是为什么我需要这个问题的匹配项。然后我可以阅读一些论文并了解 2018 年的“最新技术”。
我有一个表my_tables
,它在几个表中被引用为外键。
我想选择my_table
其他表中未引用的所有行。
AFAIK,应该可以用一种通用的方式来做到这一点(有一些内省的魔法)。
我读了这篇关于 PostgreSQL 在 SSD 上的性能的文章:
这两种配置似乎很重要random_page_cost
vsseq_page_cost
由于两个参数都需要匹配特定的硬件,我想知道是否可以自动检测匹配值?
更新
我有这些步骤:
我使用此代码段来检测丢失的索引:
https://stackoverflow.com/a/12818168/633961
例子:
SELECT
relname AS TableName,
to_char(seq_scan, '999,999,999,999') AS TotalSeqScan,
to_char(idx_scan, '999,999,999,999') AS TotalIndexScan,
to_char(n_live_tup, '999,999,999,999') AS TableRows,
pg_size_pretty(pg_relation_size(relname :: regclass)) AS TableSize
FROM pg_stat_all_tables
WHERE schemaname = 'public'
AND 50 * seq_scan > idx_scan -- more then 2%
AND n_live_tup > 10000
AND pg_relation_size(relname :: regclass) > 5000000
ORDER BY relname ASC;
结果:
tablename | totalseqscan | totalindexscan | tablerows | tablesize
----------+--------------+----------------+-----------+----------
mytable | 112,479 | 2,978,344 | 1,293,536 | 1716 MB
我很好奇 - 我想看看哪些 SQL 语句实际上对表进行了序列扫描mytable
。
有没有办法让 PostgreSQL 在对该表进行顺序扫描时发出警告?
我有一个包含 col1、col2、col3 列的简单表。都不能为空。
我想删除元组 (col1, col2) 有多个条目的所有行。背景:应添加 (col1, col2) 的唯一约束。
drop table mytable;
create table mytable (
col1 integer not null,
col2 integer not null,
col3 integer not null);
-- rows to delete
insert into mytable values (1, 1, 1);
insert into mytable values (1, 1, 2);
-- rows to keep
insert into mytable values (2, 2, 1);
insert into mytable values (2, 3, 2);
delete from mytable where
(col1, col2) in (
select col1, col2 from mytable
group by (col1, col2) having count(distinct col3) >1) ;
select * from mytable;
以上适用于 PostgreSQL 10,但在旧版本上失败。
旧版本告诉我这个错误信息:
错误:列“mytable.col1”必须出现在 GROUP BY 子句中或在聚合函数中使用
如何让它在 PG 9.3 上运行?
我有这个 N:M 关系:
CREATE TABLE auth_user (
id integer NOT NULL PRIMARY KEY,
username character varying(150) NOT NULL UNIQUE
);
CREATE TABLE auth_group (
id integer NOT NULL PRIMARY KEY,
name character varying(80) NOT NULL UNIQUE
);
CREATE TABLE auth_user_groups (
id integer NOT NULL PRIMARY KEY,
user_id integer REFERENCES auth_user(id) NOT NULL,
group_id integer REFERENCES auth_group(id) NOT NULL,
CONSTRAINT user_groups UNIQUE(user_id, group_id)
);
INSERT INTO auth_user VALUES (1, 'user1');
INSERT INTO auth_user VALUES (2, 'user2');
INSERT INTO auth_group VALUES (1, 'group1');
INSERT INTO auth_group VALUES (2, 'group2');
INSERT INTO auth_user_groups VALUES (1, 1, 1);
INSERT INTO auth_user_groups VALUES (2, 2, 1);
INSERT INTO auth_user_groups VALUES (3, 2, 2);
如何选择组“group1”中的所有用户名?
我使用 PostgreSQL,但首选可在任何地方使用的 SQL。
在我的环境中,大多数 PostgreSQL 查询都是从 http 请求生成的。
在我的例子中,每个 http 请求都有一个唯一的标头:X-Request-ID
如果 PostgreSQL 日志中有错误或警告,我想查看相关的 X-Request-ID 以查看 sql 查询来自何处。
如何添加额外的消息,如 X-Request-ID 来记录 PostgreSQL 的消息?
我想在 PostgreSQL 数据库行中存储整个 HTTP 响应。
我需要 HTTP 状态、标头和正文。
AFAIK 对此没有本地数据类型。
我如何存储 HTTP 响应?
更新
我一直在思考这个问题。我想我最好遵循这种模式:我不会在 http 响应中搜索任何内容。它就像一个斑点。我想在其中搜索的所有内容都被提取出来并放入不同的列中。到目前为止,只有 http 状态代码会被使用,并且它会得到一个自己的列。
我们有一个基于 PostgreSQL 的系统,安装在 20 个客户处。
有时我会在所有系统上运行 SQL 查询。到目前为止,我使用这样的命令行工具来执行parallel
此操作:
parallel -q -j0 ssh {} "echo {}; psql -tAc \"select count(*) from auth_user\";echo" ::: $(ssh j list-systems prod)
我缺少对输出进行排序的能力。我想避免肮脏的 shell 脚本,并使用 SQL 智慧。
如何将 N 个 SQL 查询放入 PostgreSQL,以便我可以在其上运行普通 SQL?
(子问题:这种问题有匹配的标签吗?我的意思是 SQL 跨越多个数据库的问题?)
我的步骤:
pg_dumpall
在服务器上运行决赛prod-server-old
prod-server-old
。prod-server-new
)prod-server-new
现在如何避免在pg_dumpall
(step1 和 step2 之间)对数据库进行修改,使这段时间的修改不会丢失?
在我的情况下,有一小段停机时间是 100% 可以的。
“集群”中有几个数据库(顺便说一句,我不喜欢“集群”这个词。我想大多数人认为“集群”是一组多台计算机,但在这种情况下它意味着一个 Postgres 服务器,它拥有几个数据库)。
我的问题被标记为可能与“使 Postgres 数据库暂时只读(用于执行卷快照)”重复。我不认为它是重复的,因为在我的情况下是不同的,因为我不要求临时只读状态。
如果我只获取一行,则查询需要更长的时间:1433 毫秒对 23 毫秒
有解决办法吗?
减缓:
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM "modwork_ticket" WHERE
"modwork_ticket"."email_sender_id" = '[email protected]'
ORDER BY "modwork_ticket"."date_created" ASC limit 1;
--------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.43..542.14 rows=1 width=1146) (actual time=1433.128..1433.129 rows=1 loops=1)
Buffers: shared hit=1466151 read=4661
-> Index Scan using modwork_ticket_date_created on modwork_ticket (cost=0.43..606714.36 rows=1120 width=1146) (actual time=1433.125..1433
Filter: ((email_sender_id)::text = '[email protected]'::text)
Rows Removed by Filter: 1705251
Buffers: shared hit=1466151 read=4661
Planning time: 2.504 ms
Execution time: 1433.218 ms
快速地:
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM "modwork_ticket" WHERE
"modwork_ticket"."email_sender_id" = '[email protected]'
ORDER BY "modwork_ticket"."date_created" ASC;
--------------------------------------------------------------------------------------------------------------------------------------------
Sort (cost=4335.83..4338.63 rows=1120 width=1146) (actual time=23.637..23.794 rows=584 loops=1)
Sort Key: date_created
Sort Method: quicksort Memory: 732kB
Buffers: shared hit=544 read=4
-> Bitmap Heap Scan on modwork_ticket (cost=25.11..4279.11 rows=1120 width=1146) (actual time=20.479..22.595 rows=584 loops=1)
Recheck Cond: ((email_sender_id)::text = '[email protected]'::text)
Heap Blocks: exact=538
Buffers: shared hit=541 read=4
-> Bitmap Index Scan on modwork_ticket_email_sender_id_like (cost=0.00..24.83 rows=1120 width=0) (actual time=20.388..20.388 rows=
Index Cond: ((email_sender_id)::text = '[email protected]'::text)
Buffers: shared hit=3 read=4
Planning time: 0.173 ms
Execution time: 23.974 ms
版本:
PostgreSQL 9.6.3 on x86_64-suse-linux-gnu, compiled by gcc (SUSE Linux) 4.7.2 20130108 [gcc-4_7-branch revision 195012], 64-bit
我在运行上述查询之前运行“VACUUM ANALYZE”。
我有包含这些(和其他)列的表票:
如果ticket_type
或client
得到更新,那么表格transfere_table
应该被归档。已更改机票的 ticket.id 应插入到转账表中。
这是工作代码:
CREATE FUNCTION add_ticket_to_transfere_table () RETURNS trigger
LANGUAGE plpythonu AS $$
plpy.execute(plpy.prepare(
'''INSERT INTO transfere_table (ticket_id) VALUES ($1)''',
['int']), [TD['new']['id']])
$$;
CREATE TRIGGER add_ticket_to_transfere_table_trigger
AFTER UPDATE OF ticket_type_id, client_id ON ticket
FOR EACH ROW
WHEN (OLD.ticket_type_id != NEW.ticket_type_id or
OLD.client_id != NEW.client_id)
EXECUTE PROCEDURE add_ticket_to_transfere_table();
由于我到现在只用过plpythonu,所以就这样解决了。它有效,但我看到有两点需要改进:
如何实现这些改进?
还有其他可以改进的地方吗?
我正在使用 PostgreSQL 9.3.13
我有一个简单的 N:M 关系:
表用户:
表权限:
表用户权限:
我想确保如果用户有“is_superuser=True”,那么他应该通过 N:M Table UserPermission 设置所有可用的权限。
典型操作:
如何使用 Postgres 9.6 确保这一点?
子问题(请留言):这个模式有名字吗?
“避免冗余”对我很重要。
我想将用于配置管理的输入数据存储在关系数据库中。
我的输入数据:
在 95% 的所有情况下,所有属性都是相等的:
如果我将这些数据存储在 YAML 中,那么我可以使用变量来避免重复。
AFAIK 这在关系数据库中不起作用。
我可以将其存储在数据库中,但据我所知,我需要自己对其进行评估:
如果将其存储在关系数据库中,如何避免冗余?不幸的是,这些值并不总是相等的,只是在大多数情况下。
我使用 PostgreSQL