我是 psql 的新手,需要一些帮助。如何将本地 CSV 加载到远程数据库?
我正在使用以下命令
\COPY test(user_id, product_id, value)
FROM '/Users/testuser/test.tsv' WITH DELIMITER '\t' CSV HEADER;
Run Code Online (Sandbox Code Playgroud)
但这会在远程数据库上搜索文件,而我需要在本地 PC 上执行此操作。
每当我在 PostgreSQL Maestro 中创建一个全新的数据库时,它都会创建以下默认模式列表:

现在根据我的理解,模式就像组织文件夹等。所以我的问题是当我创建新数据库时是否需要所有这些模式?如果是这样,它们在 PG 方面用于什么,因为我自己永远不会使用它们。
我可以理解,information_schema因为这是在服务器上安装 MySQL 的默认设置,尽管我不明白为什么数据库需要它自己而不是整个服务器,但我猜每个数据库类型都有他自己的。
apt-get安装了 Postgres 9.2.4(使用 PPA)。pg_dropcluster --stop 9.2 main删除默认的数据库集群,因为我打算在刚刚挂载的单独 SSD 卷(一个 Rackspace 块存储卷)上创建一个新集群。ps显示为该新集群运行的所有正常 Postgres 进程,我能够打开 Postgres shell 并运行 SQL - 即它运行良好)。现在,当我运行时pg_lsclusters,没有列出任何内容。main在我删除它之前,集群列出得很好。为什么我的新集群不显示,即使它正在运行?我什至重新启动了服务器(以防万一)。
我希望根据列是否包含在作为整数数组传递的大值列表中来选择行。
这是我目前使用的查询:
SELECT item_id, other_stuff, ...
FROM (
SELECT
-- Partitioned row number as we only want N rows per id
ROW_NUMBER() OVER (PARTITION BY item_id ORDER BY start_date) AS r,
item_id, other_stuff, ...
FROM mytable
WHERE
item_id = ANY ($1) -- Integer array
AND end_date > $2
ORDER BY item_id ASC, start_date ASC, allowed ASC
) x
WHERE x.r <= 12
Run Code Online (Sandbox Code Playgroud)
该表的结构如下:
Column | Type | Collation | Nullable | Default
---------------+-----------------------------+-----------+----------+---------
item_id | integer | | not null …Run Code Online (Sandbox Code Playgroud) Postgres 函数声明为波动性分类VOLATILE,STABLE或IMMUTABLE。众所周知,该项目对内置函数的这些标签非常严格。并且有充分的理由。突出的例子:表达式索引只允许IMMUTABLE函数并且那些必须是真正不可变的以避免错误的结果。
用户定义的函数仍然可以按照所有者的选择自由声明。手册建议:
为了获得最佳优化结果,您应该使用对它们有效的最严格的波动率类别来标记您的函数。
...并添加了大量可能因波动率标签不正确而出错的事情列表。
尽管如此,在某些情况下,伪造不变性是有道理的。大多数情况下,当您知道该函数实际上在您的范围内是不可变的。例子:
除了对数据完整性的所有可能影响之外,对性能的影响是什么?人们可能认为声明一个函数IMMUTABLE只会对性能有益。是这样吗?
声明函数波动性会IMMUTABLE 损害性能吗?
让我们假设当前的 Postgres 10 来缩小范围,但所有最近的版本都很有趣。
My table employees contain more than ten million data. i want to update 10k rows in commission_pct column where commission_pct is null and set zero(0) value.
in oracle I can easily solve this by using rownum.
update employees
set commission_pct=0
where commission_pct is null and rownum<=10000;
Run Code Online (Sandbox Code Playgroud)
but postgresql does not support rownum.
how to solve this in postgresql?
我们一再看到尝试索引值超过最大大小的列失败。Postgres 10 有这样的错误信息:
Run Code Online (Sandbox Code Playgroud)ERROR: index row size xxxx exceeds maximum 2712 for index "foo_idx" HINT: Values larger than 1/3 of a buffer page cannot be indexed. Consider a function index of an MD5 hash of the value, or use full text indexing.
例子:
等等。
现在,a_horse_with_no_name 演示了一个具有更大text值(10000 个字符)的案例,它似乎仍然适用UNIQUE于 Postgres 9.6 中的索引。引用他的测试用例:
create table tbl (col text);
create unique index on tbl (col);
insert into tbl
values (rpad(md5(random()::text), 10000, md5(random()::text)));
select length(val) …Run Code Online (Sandbox Code Playgroud) 我目前有一个看起来像这样的表:
CREATE TABLE "PDPC".collection
(
col_no bigint NOT NULL DEFAULT nextval('"PDPC".collection_col_no_seq'::regclass),
q1 character varying(10000) COLLATE pg_catalog."default",
q2 character varying(10000) COLLATE pg_catalog."default",
q3 character varying(10000) COLLATE pg_catalog."default",
q4 character varying(10000) COLLATE pg_catalog."default",
dg_fkey bigint,
CONSTRAINT collection_pkey PRIMARY KEY (col_no),
CONSTRAINT collection_dg_fkey_fkey FOREIGN KEY (dg_fkey)
REFERENCES "PDPC".datagroup (dg_no) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
ALTER TABLE "PDPC".collection
OWNER to postgres;
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 postgresql 在 PHP 中执行 UPSERT 语句,但我收到了
致命错误:未捕获的 PDOException:SQLSTATE[42P10]:无效的列引用:7 …
我在摆弄VACUUM并注意到一些意想不到的行为,其中SELECT从表中ing 行似乎减少了VACUUM之后必须做的工作。
注意:autovacuum 被禁用
CREATE TABLE numbers (num bigint);
ALTER TABLE numbers SET (
autovacuum_enabled = 'f',
toast.autovacuum_enabled = 'f'
);
INSERT INTO numbers SELECT generate_series(1, 5000);
Run Code Online (Sandbox Code Playgroud)
现在我们对所有行运行更新,
UPDATE numbers SET num = 0;
Run Code Online (Sandbox Code Playgroud)
当我们跑步时,VACUUM (VERBOSE) numbers;我们得到,
INFO: vacuuming "public.numbers"
INFO: "numbers": removed 5000 row versions in 23 pages
INFO: "numbers": found 5000 removable, 5000 nonremovable row versions in 45 out of 45 pages
DETAIL: 0 dead row versions …Run Code Online (Sandbox Code Playgroud) 我需要在 Ubuntu 18.04 系统上使用pg_basebackup/pg_dump程序连接到远程 PostgreSQL 11.6 服务器。
但是目前系统只包含pg_basebackup10.10,远程数据库使用的是PostgreSQL 11.6。运行pg_basebackup给出错误
pg_basebackup:不兼容的服务器版本 11.6
尝试pg_basebackup使用以下命令安装正确版本:
apt install postgresql-client-11
Run Code Online (Sandbox Code Playgroud)
但是找不到apt包。只有postgresql-client,postgresql-client-10和postgresql-client-common可用于系统的 apt 存储库。
问题:如何在pg_basebackup不从远程数据库服务器复制过来的情况下安装正确的版本,并且在这台机器上不安装PostgreSQL 11.6?
postgresql ×10
performance ×2
update ×2
backup ×1
foreign-key ×1
functions ×1
index ×1
insert ×1
limits ×1
pg-dump ×1
schema ×1
select ×1
size ×1
ubuntu ×1
vacuum ×1