我的 postgres 数据库有一个名为“id”的列,其范围从 40,000,000 到大约 50,000,000。“id”列是主键。我需要更改“id”列值,使它们跨越不同的数字,以便将此数据库与另一个数据库合并。
我如何生成代码以将值从 40,000,000 - 50,000,000 更改为 0 - 10,000,000?
表的定义是
CREATE TABLE public.keyvaluehistory (
id bigint NOT NULL
DEFAULT nextval('keyvaluehistory_id_seq'::regclass),
segkey text NOT NULL,
dvalue double precision,
bvalue bytea,
tstamp timestamp with time zone,
CONSTRAINT keyvaluehistory_pkey PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)
表上没有外键。
我可以承受几分钟/几小时的停机时间。
我是一名数据库学生,我执行了以下查询来同时学习一些内容(LEFT/RIGHT JOIN、UNION、WHERE + RegEx)。令我困扰的是执行顺序。我有两个表,如下所示:
create table practicaleft(
id smallint primary key,
nombre varchar,
cumple date
);
create table practicaright(
id smallint primary key,
apellido varchar,
cumpleanios date
);
Run Code Online (Sandbox Code Playgroud)
然后,我插入一些随机数据:
INSERT INTO practicaleft VALUES
(1, 'John', CURRENT_DATE - 1),
(5, 'Alice', CURRENT_DATE - 5),
(3, 'Bob', CURRENT_DATE - 3),
(7, 'Eva', CURRENT_DATE - 7);
INSERT INTO practicaright VALUES
(5, 'Doe', CURRENT_DATE - 5),
(6, 'Smith', CURRENT_DATE - 6),
(3, 'Johnson', CURRENT_DATE - 3),
(4, 'Brown', CURRENT_DATE - 4);
Run Code Online (Sandbox Code Playgroud)
之后,我执行此查询:
select id, …Run Code Online (Sandbox Code Playgroud) 我收到以下错误:
ERROR: canceling statement due to conflict with recovery.
Detail: User query might have needed to see row versions that must be removed.;
nested exception in org.postgresql.util.PSQLException:ERROR:canceling statement due to conflict with recovery.
Detail: User query might have needed to see row versions that must be removed.
Run Code Online (Sandbox Code Playgroud)
当我们使用长查询时,此错误发生在备用数据库上。我们使用 PostgreSQL 版本 12.0。一台主服务器和两台备用服务器。
您能给我们解决方案吗?
我们正在做一个新的数据库设计,我们预先设置一些规则。我不知道制定这些规则有多大意义,
每个表名和列名都应该有意义。它应该提供有关表或列用途的信息。
表名不应超过 27 个字符,列名不应超过 30 个字符。
表名是复数。例如:COMPANIES, EMPLOYEES, PERSONS, GENDERS, RELIGIONS, COUNTRIES, ...
每个表都有一个主键,table_name_ID即NUMBER(15). 表名在主键列中用作单数。示例:该USER_REQUESTS表的主键为USER_REQUEST_ID。
如果表名或列名超出限制,则使用合适的缩写。示例:CMS_EXEMPTIONS是保留内容管理系统豁免的表。
保留事务数据的表应以_TRANS. 示例:COMPANY_TRANS是保存公司相关交易数据的表。
每个表有 4 个 WHO 列,如下所示:
CREATE_USER NUMBER(15)
CREATE_DATE DATE
MODIFY_USER NUMBER(15)
MODIFY_DATE DATE
Run Code Online (Sandbox Code Playgroud)作为外键关系的列被命名为被引用表的主键。示例:如果一个表有对该COUNTRIES表的引用,则引用列也被命名COUNTRY_ID为该COUNTRIES表的主键。
如果由于第一条规则(有意义的名称),引用列的含义应该不同于第 8 条规则,则应用有意义的名称规则。例如:COUNTRIES如果它用于保持一个人的国籍而不是命名为 ,那么nationality 和 country 列都与table有关系NATIONALITY_ID。
如果该表有多个与同一个表相关,则它们会被赋予不同的名称,例如BIRTH_COUNTRY_ID,PASSPORT_ISSUE_COUNTRY_ID
如果表是表之间的关系表,则表名包含两个表名。
给有意义的名字一直是我们命名的第一条规则。
我知道如何设置特定列的统计级别,即
alter table table_name alter column column_name set statistics 100;
Run Code Online (Sandbox Code Playgroud)
但是,如果我希望为特定表或特定模式设置统计级别,是否有一个 liner 命令?
有没有办法让我从子查询返回多个列,或者至少返回一个作为我需要的所有列的 JSON 对象的列?
这是一个有效的查询:
select r.*,
(select status
from builds
where repo = r.id
and branch = 'master'
order by id desc
limit 1)
from repos r
where id = any($1)
Run Code Online (Sandbox Code Playgroud)
在哪里$1id 数组在
但我想返回的不仅仅是表中的状态列builds:
select r.*,
(select status, start_time, end_time
from builds
where repo = r.id
and branch = 'master'
order by id desc
limit 1)
from repos r
where id = any($1)
Run Code Online (Sandbox Code Playgroud)
环顾四周后,似乎这row_to_json应该对我有用。但是,我不确定在这种情况下它应该如何工作:
select r.*,
row_to_json(select status,
start_time, end_time
from builds
where repo …Run Code Online (Sandbox Code Playgroud) 根据我的经验,如果您的数据库中有数千/数百万行,如本答案以及我在这里回答的内容和提问者的回答SELECT TOP中所示,则要快得多。SELECT MIN()MAX()
我的问题是为什么,根据我的理解,TOP查看数据SELECT column FROM table与执行 a 时相同ORDER BY column,它会对结果进行排序,然后只给出顶行,而MIN()/MAX()函数实际上应该只查看每一行,检查该行的总和行,然后转到下一行,如果该行是>或<前一行,则将结果保存在函数中取决于它是否为 saMAX()或 a MIN(),而这正是ORDER BY应该做的。
请不要回答,根据您的经验, 比MAX()更好TOP,因为问题实际上是MAX()/MIN()和之间有什么区别TOP?两者都查看每一行的数据,并且都可能是log(n)。
回复@JD:
\n\n\n一个简单的例子是,如果您使用 TOP 而不使用 ORDER BY 子句。然后,您将返回的最高结果可能是不确定的,并且并不总是必须与 MAX() 聚合函数引用的同一行。
\n
当然,我只是问你何时使用,ORDER BY …
PostgreSQL: 9.4
FreeBSD: 11.2
当我将TimeZone参数设置为postgresql.conf时,localtime在尝试启动 PostgreSQL 时收到以下错误。
service postgresql restart
<2022-06-02 11:18:27.612 EDT> LOG: invalid value for parameter "TimeZone": "localtime"
<2022-06-02 11:18:27.613 EDT> FATAL: configuration file "/usr/local/pgsql/data/postgresql.conf" contains errors
pg_ctl: could not start server
Examine the log output.
Run Code Online (Sandbox Code Playgroud)
在我的搜索过程中,我发现了这个对应关系,这似乎表明 /etc/localtime 应该是一个符号链接。我的不是,所以我尝试将其更改为符号链接,但它仍然不起作用,因为我得到了与上面相同的错误。
mv /etc/localtime /etc/localtime.bak
ln -s /usr/share/zoneinfo/America/Yellowknife
shutdown -r now
ls -la /etc/localtime
lrwxr-xr-x 1 root wheel 35 Jun 2 11:04 /etc/localtime -> /usr/share/zoneinfo/America/Yellowknife
Run Code Online (Sandbox Code Playgroud)
可以开始TimeZone工作localtime吗FreeBSD …
免责声明:我将 PostgreSQL 和 PostgreSQL 单独用于我的所有数据库。这不是某种“仇恨”。
这是困扰我多年的事情,但在这一点上,在2020年,它只是荒谬的。
来源:https : //www.postgresql.org/docs/current/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-WHAT
application_name 可以是任何少于 NAMEDATALEN 字符(标准版本中为 64 个字符)的字符串。它通常由应用程序在连接到服务器时设置。该名称将显示在 pg_stat_activity 视图中并包含在 CSV 日志条目中。它也可以通过 log_line_prefix 参数包含在常规日志条目中。在 application_name 值中只能使用可打印的 ASCII 字符。其他字符将替换为问号 (?)。
(强调我的。)
所以,自称“世界上最先进的开源关系数据库”不支持 Unicode/UTF-8 这个特定的东西,但在其他地方。它迫使我(和我的潜在老板,如果我有的话)看到一堆“???????????” 遍布控制面板,例如在 pgAdmin 4 中。
我听说这应该是出于“安全问题”的考虑。在他们设置“Unicode 引擎”之前的某个阶段设置了有关 application_name 的某些内容或类似的内容。我不明白。如果真的是这样,当然,力ASCII-只为应用程序名称时,它在最初的连接设置,但也允许使用Unicode / UTF-8后当设置应用程序名称,连接已经建立后使用,在正常查询“SET”关键字!
我不明白。为什么我被迫到处看到这些丑陋的问号,只是因为我的语言恰好包含的不仅仅是 A-Za-z?即使以英语为中心的数据库也可能有与其他语言相关的脚本或具有花哨名称的服务,因此即使 PG 项目以美国为中心,这仍然不能成为借口。
postgresql ×8
query ×2
aggregate ×1
jobs ×1
oracle ×1
primary-key ×1
replication ×1
sql-server ×1
statistics ×1