我似乎无法为我的问题找到答案,也许我没有问正确的问题,但它是这样的:
我在 pgAdmin 中基本上有两个表,比如说studentand grades,最终有一个外键约束(student_id 引用 student(id)
CREATE TABLE student (
id CHAR(2),
name CHAR(4),
PRIMARY KEY (id));
CREATE TABLE grade (
student_id CHAR(2),
grade INT,
FOREIGN KEY (student_id) REFERENCES student(id));
Run Code Online (Sandbox Code Playgroud)
我想做的是将两个文件复制/导入到数据库中。一切对学生都有好处,但我的grade.csv文件将包含不存在的学生 ID,我希望导入忽略而不是插入它们。取而代之的是,命令失败,没有导入任何内容。
什么是正确有效的方法来做到这一点?
我有下表(剥离到基本要素):(脚本在 postgresql 中)
CREATE TABLE t_version (
name VARCHAR(64) NOT NULL,
major INTEGER NOT NULL,
minor INTEGER NOT NULL,
attr VARCHAR(64)
);
ALTER TABLE t_version
ADD CONSTRAINT PK_VERSION
PRIMARY KEY (name, major, minor);
Run Code Online (Sandbox Code Playgroud)
以及一些测试数据:
INSERT INTO t_version (name, major, minor, attr) VALUES ('n1', 1, 0, 'a1');
INSERT INTO t_version (name, major, minor, attr) VALUES ('n1', 1, 1, 'a2');
INSERT INTO t_version (name, major, minor, attr) VALUES ('n1', 2, 0, 'a3');
Run Code Online (Sandbox Code Playgroud)
我想弄清楚,如何从中选择最高版本,即一个可以给我的选择
'n1', 2, 0, 'a3'
其结果。
我知道如何做到这一点,当只需要最高的次要版本时:
SELECT A.name, A.major, …Run Code Online (Sandbox Code Playgroud) 我在将 CSV 文件从网络共享驱动器复制到 postgreSQL 时遇到问题,目前的解决方法是先将文件复制到本地驱动器,但这是链中的另一个过程,它变得过于混乱。
如果我运行以下命令
COPY test_schema.test FROM 'X:\_Postgres DBs\Testing\test_file.csv'
CSV HEADER;
Run Code Online (Sandbox Code Playgroud)
我得到:
ERROR: could not open file "X:\_Postgres DBs\Testing\test_file.csv"
for reading: No such file or directory
Run Code Online (Sandbox Code Playgroud)
好的,所以 postgreSQL Server 不理解 Windows 映射驱动器,很好,但是如果我运行:
COPY test_schema.test FROM '\\ws7.domain.com\share-name\_Postgres
DBs\Testing\test_file2.csv' CSV HEADER;
Run Code Online (Sandbox Code Playgroud)
我得到:
ERROR: could not open file "\\ws7.domain.com\share-name\_Postgres
DBs\Testing\test_file2.csv" for reading: Permission denied
Run Code Online (Sandbox Code Playgroud)
文件 test_file2.csv 可以在同一台服务器上本地打开,例如记事本/记事本++/写字板,因此看起来没有任何文件属性,例如“正在使用的文件”
任何人有任何提示如何将 COPY 与共享网络驱动器一起使用?(我们的数据库 UI 是用 Delphi 编码的,所以我正在寻找处理 postgresql 脚本的方法,我可以从 Delphi 调用,否则我将不得不编写一些繁琐的 Delphi Firedac 批处理方法。)
在 PostgreSQL 中,我试图在一个函数中构建一个 where 子句,该函数使用入站参数来确定 IN 的内容
例如:
select fld1, count(fld1)
from xyz
where fld1 in (
case $1
when 1 then 'Value1'
when 2 then 'Value2'
when 3 then '''Value1'',''Value2'''
when 4 then '''Value4'',''Value5'',''Value6'''
else NULL
)
group by fld1
Run Code Online (Sandbox Code Playgroud)
值 1 和值 2 一样正常工作,值 3 和 4 在语法上没有失败,但没有返回任何行。
我有一个deflator定义为的表:
Table "deflator"
Column | Type | Modifiers
-------------+-------------------+-----------
country_code | smallint | not null
country_name | character varying | not null
year | smallint | not null
deflator | numeric |
source | character varying |
Run Code Online (Sandbox Code Playgroud)
此表的示例输出如下所示:
country_code | country_name | year | deflator | source
-------------+---------------+------+----------+----------
1 | country_1 | 2016 | 12 | source_1
1 | country_1 | 2015 | 11 | source_2
1 | country_1 | 2014 | 10 | source_2
2 | country_2 …Run Code Online (Sandbox Code Playgroud) 我在 Ubuntu 14.04 上使用 Postgres 9.5。我想在日志达到特定大小时旋转它们。所以我编辑了 /etc/postgresql/9.5/main/postgresql.conf 并设置了这个
log_rotation_size = 50MB # Automatic rotation of logfiles will
# happen after that much log output.
# 0 disables.
Run Code Online (Sandbox Code Playgroud)
然后我重新启动了我的服务器
sudo /etc/init.d/postgresql restart
Run Code Online (Sandbox Code Playgroud)
但是在运行了一些操作之后,我的磁盘空间用完了,并且发现我的日志根本没有轮换……
myuser@mymachine:~$ ls -al /var/log/postgresql/postgresql-9.5-main.log
-rw-r----- 1 postgres postgres 3165773943 Dec 29 18:34 /var/log/postgresql/postgresql-9.5-main.log
Run Code Online (Sandbox Code Playgroud)
我还需要做什么才能开始日志轮换?
在PostgreSQL中,如何生成行号:
SELECT这是一些可以使用的示例数据,
CREATE TEMP TABLE foo AS
SELECT * FROM ( VALUES
('wgates', 'Gates', 'William' ),
('wgrant', 'Grant', 'Wallace' ),
('jjones', 'Jones', 'John' ),
('psmith', 'Smith', 'Paul' )
) AS t(name_id, last_name, first_name);
Run Code Online (Sandbox Code Playgroud)
所需的输出是:
row_number ? name_id ? last_name ? first_name
???????????????????????????????????????????????
1 ? wgates ? Gates ? William
2 ? wgrant ? Grant ? Wallace
3 ? jjones ? Jones ? John
4 ? psmith ? Smith ? Paul
Run Code Online (Sandbox Code Playgroud)
其中一些方法可能会变得棘手。请解释你的答案。我还可以想象两类有效的答案:
UNIQUE或的数据 …我试图在 Postgres 9.5 中从这个查询中挤出更多的性能。我正在运行超过 400,000 行。
在玩弄它时,我注意到这些CASE语句增加了相当多的查询成本 - 如果我用简单地对一些现有列求和来替换它们,它会将执行时间减半。有没有更有效的方法来计算这些总和?
SELECT sum("tag1"), sum("tag2"), sum("total_tags")
FROM (
SELECT people.data->'recruiter_id' AS recruiter_id,
(CASE WHEN people.data->'tags' ? 'tag1' THEN 1 END) AS "tag1",
(CASE WHEN people.data->'tags' ? 'tag2' THEN 1 END) AS "tag2",
((CASE WHEN people.data->'tags' ? 'tag1' THEN 1 ELSE 0 END) +
(CASE WHEN people.data->'tags' ? 'tag2' THEN 1 ELSE 0 END)) AS total_tags
FROM people WHERE people.data->'tags' ?| ARRAY['tag1','tag2'] ) AS target
GROUP BY recruiter_id
Run Code Online (Sandbox Code Playgroud)
的输出EXPLAIN ANALYSE: …
postgresql performance statistics execution-plan json postgresql-performance
我有以下查询:
SELECT id,
email,
first_name as "firstName",
last_name as "lastName",
is_active as "isActive",
password,
access,
CASE
WHEN access < 3 THEN (
SELECT
CASE WHEN count(*) = 1 THEN true ELSE false END
FROM user_rating_entity ure
WHERE ure.user_id = u.id
AND ure.rating_entity_id = :re_id
)
ELSE true
END as "isResponsible"
FROM users u
WHERE u.id = :id
Run Code Online (Sandbox Code Playgroud)
如果access > 3,字段“isResponsible”应直接设置为true,并且不应执行子查询。我在这两种情况下都使用了解释分析,其中 access>=和<to 3但我得到了相同的输出。
为什么呢?
postgresql ×10
case ×1
copy ×1
csv ×1
datetime ×1
disk-space ×1
explain ×1
foreign-key ×1
insert ×1
json ×1
log ×1
optimization ×1
performance ×1
pgadmin ×1
pivot ×1
size ×1
sql-server ×1
statistics ×1
subquery ×1
where ×1