以前,当我通过 Terraform 使用 Bitnami Helm 图表来部署 PostgreSQL 时,我会创建一个数据库。现在我不再创建数据库了。我在用着
- 相同的连接字符串
- 相同的用户名
- 相同的密码
但我在 Kubernetes 日志中收到此错误,
psql:错误:致命:数据库“foo”不存在
为什么我不再有初始数据库?
以前,当我通过 Terraform 使用 Bitnami Helm 图表来部署 PostgreSQL 时,我会创建一个数据库。现在我不再创建数据库了。我在用着
但我在 Kubernetes 日志中收到此错误,
psql:错误:致命:数据库“foo”不存在
为什么我不再有初始数据库?
我们有一张 CustomerNote 表,其中包含 4 列 ID、CustomerID、Note、Date
CustomerID asc 上有一个索引,Date desc
当执行以下查询时
select top 30
Date
from CustomerNote
where CustomerID in (1,5)
order by Date desc
使用了索引,但它仍在为 customerID 的 1 和 5 获取所有 CustomerNotes,然后进行排序/置顶,导致大量 CPU 使用率。
这是由于“in”子句中的多个值。我知道“in”子句的值永远不会超过 10,因此如果 sql server 迭代 10,每个 customerID 至少获取 30 个,然后进行合并、排序和排序,这将是一个更好的方法。是否有查询提示或选项来实现此目的?
CREATE OR REPLACE FUNCTION public.fn_question_3_3()
RETURNS TABLE(name character varying, surname character varying, person_t person_type)
AS
$$
DECLARE
pt person_type;
BEGIN
RETURN QUERY
SELECT DISTINCT pr.name, pr.surname, pr.person_t
FROM "Person" pr
CROSS JOIN "Professor" prof
CROSS JOIN "LabTeacher" lt
CROSS JOIN "Student" st;
IF pr.amka = prof.amka THEN
pt = 'Professor';
ELSIF pr.amka = lt.amka THEN
pt = 'LabTeacher';
ELSE
pt = 'Student';
END IF;
pt = pr.person_t;
END;
$$
LANGUAGE 'plpgsql';
SELECT*FROM fn_question_3_3()
所以我试图在这里做一个简单的查询,我检查这个人的 amka,如果它与其他表之一相同,那么它更新 person_t 列并返回姓名、姓氏和 person_t。
问题是查询SELECT * FROM fn_wuestion_3_3()
需要超过 10 分钟才能完成,而对于这样的查询,情况不应该如此。任何帮助将不胜感激,因为我对数据库和 postgresql/pgadmin4 很陌生。
表:“Person”有 4820 行
表:“Professor”有 123 行
表:“LabTeacher”有 77 行
表:“Student”有 3194 行
索引定义分别为“Person”的 pr、“Professor”的 prof、“Student”的 st 和“LabTeacher”表的 lt。
我有一张表“MyTable”,如下所示:
工具 | 团队 | 公制 | 日期 |
---|---|---|---|
工具1 | 团队1 | 25 | 2023 年 1 月 1 日 |
工具1 | 团队1 | 10 | 2/1/2022 |
工具2 | 团队2 | 20 | 2022 年 1 月 2 日 |
我想按年定期聚合“指标”(不同的年份作为列)并让 sql 查询返回类似这样的内容,其中“年”列的值将是“指标”的总和
工具 | 团队 | 2023年 | 2022年 |
---|---|---|---|
工具1 | 团队1 | 25 | 10 |
工具2 | 团队2 | 0 | 20 |
任何人都可以帮我这样的查询吗?对于这些情况,我需要首先从表中推断出不同的年份,然后使用它。而这个不同年份的列表需要来自一个时间范围。对于此示例,我们可以将时间范围表示为:WHERE date between ago(600d) and now()
。我将从应用程序中收到的 600 值,这就是年份不固定的原因。
我尝试过使用“pivot”,但我正在使用的数据库引擎不支持它。
我将 a 的结果行SELECT
与 相乘CROSS JOIN generate_series(1, max)
。我的查询是这样的:
select id, name
from person
CROSS JOIN generate_series(1, 4)
where <condition>;
我有这个结果:
ID | 姓名 |
---|---|
1个 | 姓名1 |
1个 | 姓名1 |
1个 | 姓名1 |
1个 | 姓名1 |
2个 | 名字2 |
2个 | 名字2 |
2个 | 名字2 |
2个 | 名字2 |
3个 | 名字3 |
3个 | 名字3 |
3个 | 名字3 |
3个 | 名字3 |
我想要这样的结果:
ID | 姓名 |
---|---|
1个 | 姓名1 |
2个 | 名字2 |
3个 | 名字3 |
1个 | 姓名1 |
2个 | 名字2 |
3个 | 名字3 |
1个 | 姓名1 |
2个 | 名字2 |
3个 | 名字3 |
1个 | 姓名1 |
2个 | 名字2 |
3个 | 名字3 |
那可能吗?
我在下面创建了一个表
CREATE TABLE Hospitable_Planets(
Planet_name VARCHAR(30) PRIMARY KEY,
Planetmass_JPT DOUBLE,
Radius_JPT DOUBLE,
Period_days DOUBLE,
Semi_MajorAxis_AU DOUBLE,
Surface_Temp DOUBLE, /* temparture is in kelivn*/
Discovery_Method VARCHAR(30),
Discovery_Year INT,
Age_Gyr FLOAT
)
但是,每当我尝试通过表数据导入向导手动将 .csv 文件导入此表时,都会出现此错误。以下是 .csv 文件中的几行:
PlanetIdentifier,PlanetaryMassJpt,RadiusJpt,PeriodDays,SemiMajorAxisAU,SurfaceTempK,DiscoveryMethod,DiscoveryYear,AgeGyr
KOI-1843.03,0.0014,0.054,0.1768913,0.0048,,transit,2012,
KOI-1843.01,,0.114,4.194525,0.039,,transit,,
KOI-1843.02,,0.071,6.356006,0.052,,transit,,
Kepler-9 b,0.25,0.84,19.22418,0.143,707.2,transit,2010,
Kepler-9 c,0.17,0.82,39.03106,0.229,557.9,transit,2010,
tbl_cities
我使用以下代码创建了它:
CREATE TABLE IF NOT EXISTS public.tbl_Cities
(City_ID SERIAL NOT NULL,
City_Name VARCHAR(100) NOT NULL,
City_State_Region VARCHAR(100),
ID_Country INT NOT NULL,
CONSTRAINT PK_City_ID PRIMARY KEY (City_ID));
现在我想查询这些列及其数据类型的完全相同的顺序,以确保列名是什么以及真正的列顺序是什么(无需回滚到语句CREATE TABLE
)。INSERT
在我即将编写和执行的语句的上下文中。
要了解此信息,我执行:
SELECT column_name, data_type FROM information_schema.columns
WHERE table_name = 'tbl_cities';
但是我得到的输出顺序与现实中存在的列不同。
我也尝试过对列进行排序,但我知道的唯一参数是
ORDER BY column_name
. 在这种情况下,它会导致列在现实中存在的正确顺序。
SELECT column_name, data_type FROM information_schema.columns
WHERE table_name = 'tbl_cities'
ORDER BY column_name;
我的问题是:实现列在表中的实际顺序的正确语法是什么,以防按字母顺序排列它们会返回不同的结果/顺序。
我发现了这个问题,但它涉及 SQL Server,我需要在 PostgreSQL v14.7 上执行此操作。
我不仅对不同的答案持开放态度information_schema.columns
,而且对其他任何类型的答案都持开放态度:
SELECT * FROM pg_catalog.pg_tables;
我在 Azure 上有一个 PostgreSQL 数据库,我创建了一个 readonly_user 角色,允许外部各方使用连接字符串以只读方式连接到数据库。
此 readonly_user 已被授予 SELECT 权限,并且它还具有对公共模式的 USAGE 访问权限。
但是,我数据库中的表具有复合主键。当我以管理员用户身份登录时,我可以使用以下命令访问这些主键:
SELECT
tc.table_schema,
tc.table_name,
kcu.column_name
FROM
information_schema.table_constraints tc
JOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name
WHERE
tc.table_name = 'player_data' AND
tc.constraint_type = 'PRIMARY KEY';
出于某种原因,无论我如何尝试使用 readonly_user 的使用和访问角色,此命令(以及其他类似命令)访问数据库表的主键信息总是返回 0 行。每个表应该至少有 3 个,当我以管理员角色连接发出此命令时,我可以清楚地看到这一点。
只读用户是否存在某些限制其访问 information_schema 的内容?如何以只读用户身份访问表的主键?
我的 Postgres 13 数据库中有一个包含用户订阅的表。我添加了一个 GiST 索引来禁止同一用户的重叠时间范围:
CREATE INDEX user_sub_exclusion_index ON public.user_sub USING gist (user_id, tstzrange(sub_start, sub_end))
但是今天我发现它不起作用。
这是表 DDL:
-- DROP TABLE public.user_sub;
CREATE TABLE public.user_sub (
id int8 NOT NULL GENERATED ALWAYS AS IDENTITY,
app_id varchar NOT NULL,
product_id int4 NOT NULL,
iap_product_id int8 NOT NULL,
created_time int8 NOT NULL,
updated_time int8 NOT NULL,
user_id int8 NOT NULL,
sub_start_time int8 NOT NULL DEFAULT 0,
sub_end_time int8 NOT NULL DEFAULT 0,
enabled int2 NOT NULL DEFAULT 1,
order_id varchar NOT NULL,
sub_start timestamptz NOT NULL,
sub_end timestamptz NOT NULL,
CONSTRAINT user_sub_new_pk PRIMARY KEY (id),
CONSTRAINT user_sub_new_un UNIQUE (order_id)
);
CREATE INDEX user_sub_exclusion_index ON public.user_sub USING gist (user_id, tstzrange(sub_start, sub_end));
CREATE INDEX user_sub_tstzrange_user_id_product_id_excl ON public.user_sub USING gist (tstzrange(sub_start, sub_end, '[]'::text), user_id, product_id);
现在是表数据的示例:它包含同一用户的重叠时间范围:
INSERT INTO public.user_sub (app_id, product_id, iap_product_id, created_time, updated_time, user_id, sub_start_time, sub_end_time, enabled, order_id, sub_start, sub_end)
VALUES
('vOghoo10L9', 9, 6, 1680251663942, 1680251663942, 77, 1680501039421, 1680587439421, 1, '627599858277646336', '2023-04-03 13:50:39.421', '2023-04-04 13:50:39.421')
, ('vOghoo10L9', 9, 6, 1680263287925, 1680263287925, 77, 1680587439422, 1680673839422, 1, '627697298195189760', '2023-04-04 13:50:39.422', '2023-04-05 13:50:39.422')
, ('vOghoo10L9', 9, 6, 1680263497256, 1680263497256, 77, 1680673839423, 1680760239423, 1, '627679779371601920', '2023-04-05 13:50:39.423', '2023-04-06 13:50:39.423')
, ('vOghoo10L9', 9, 6, 1680263539890, 1680263539890, 77, 1680760239424, 1680846639424, 1, '627680143827259392', '2023-04-06 13:50:39.424', '2023-04-07 13:50:39.424')
, ('vOghoo10L9', 9, 6, 1680273609032, 1680273609032, 77, 1680846639425, 1680933039425, 1, '627601223242579968', '2023-04-07 13:50:39.425', '2023-04-08 13:50:39.425')
, ('vOghoo10L9', 9, 6, 1680275903068, 1680275903068, 77, 1680933039426, 1681019439426, 1, '627610724383956992', '2023-04-08 13:50:39.426', '2023-04-09 13:50:39.426')
, ('vOghoo10L9', 9, 6, 1680276434561, 1680276434561, 77, 1681019439427, 1681105839427, 1, '627612898614681600', '2023-04-09 13:50:39.427', '2023-04-10 13:50:39.427')
, ('vOghoo10L9', 9, 6, 1680277832740, 1680277832740, 77, 1681105839428, 1681192239428, 1, '627618880539664384', '2023-04-10 13:50:39.428', '2023-04-11 13:50:39.428')
, ('vOghoo10L9', 9, 6, 1680282545888, 1680282545888, 77, 1681192239429, 1681278639429, 1, '627411682153152512', '2023-04-11 13:50:39.429', '2023-04-12 13:50:39.429')
, ('vOghoo10L9', 9, 6, 1680327772145, 1680327772145, 77, 1681278639430, 1681365039430, 1, '627601513341616128', '2023-04-12 13:50:39.430', '2023-04-13 13:50:39.430')
, ('vOghoo10L9', 9, 5, 1680761228691, 1680761228691, 79, 1680761228687, 1680847628687, 1, '629789245600776192', '2023-04-06 14:07:08.687', '2023-04-07 14:07:08.687')
, ('vOghoo10L9', 9, 5, 1680763488691, 1680763488691, 77, 1680763488689, 1680849888689, 1, '629798689575354368', '2023-04-06 14:44:48.689', '2023-04-07 14:44:48.689')
, ('vOghoo10L9', 9, 5, 1680763634694, 1680763634694, 77, 1680849888690, 1688712288690, 1, '629799331018653696', '2023-04-07 14:44:48.690', '2023-07-07 14:44:48.690')
, ('vOghoo10L9', 9, 6, 1680850885924, 1680850885924, 80, 1680850881709, 1680937281709, 1, '630165239553671168', '2023-04-07 15:01:21.709', '2023-04-08 15:01:21.709')
, ('vOghoo10L9', 9, 6, 1681461059268, 1681461059268, 81, 1681461059263, 1681547459263, 1, '632723434021126144', '2023-04-14 16:30:59.263', '2023-04-15 16:30:59.263')
, ('vOghoo10L9', 9, 6, 1681483885008, 1681483885008, 82, 1681483885006, 1681570285006, 1, '632820205569245184', '2023-04-14 22:51:25.006', '2023-04-15 22:51:25.006')
, ('iYDFo0PQQX', 11, 14, 1682762462986, 1682762462986, 86, 1682762462971, 1682848862971, 1, '638182956129267712', '2023-04-29 18:01:02.971', '2023-04-30 18:01:02.971')
, ('iYDFo0PQQX', 11, 14, 1682764832099, 1682764832099, 86, 1682764832090, 1682851232090, 1, '638192942803423232', '2023-04-29 18:40:32.090', '2023-04-30 18:40:32.090')
, ('iYDFo0PQQX', 11, 14, 1682765939081, 1682765939081, 86, 1682765939052, 1682852339052, 1, '638197106476421120', '2023-04-29 18:58:59.052', '2023-04-30 18:58:59.052')
, ('iYDFo0PQQX', 11, 14, 1682766222551, 1682766222551, 86, 1682766193447, 1682852593447, 1, '638198676681232384', '2023-04-29 19:03:13.447', '2023-04-30 19:03:13.447')
;
我错过了什么吗?如何使这个约束起作用?即,防止同一用户订阅重叠的时间范围。