标签: postgresql

Postgres - 使用外键约束导入多行

我似乎无法为我的问题找到答案,也许我没有问正确的问题,但它是这样的:

我在 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 foreign-key insert pgadmin

3
推荐指数
1
解决办法
2118
查看次数

查询最高版本

我有下表(剥离到基本要素):(脚本在 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)

postgresql sql-server greatest-n-per-group

3
推荐指数
1
解决办法
411
查看次数

为什么 postgresql COPY 命令不能处理映射驱动器中的文件

我在将 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 copy csv

3
推荐指数
1
解决办法
4813
查看次数

基于参数构建 where 子句

在 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 在语法上没有失败,但没有返回任何行。

postgresql case where

3
推荐指数
1
解决办法
1538
查看次数

epoch 的简写

是否有 epoch 的速记,而不必一直打字'1970-1-1 00:00:00'

postgresql datetime

3
推荐指数
1
解决办法
44
查看次数

具有 2 列以上的枢轴(使用 CROSSTAB?)

我有一个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)

postgresql pivot postgresql-9.4

3
推荐指数
1
解决办法
2700
查看次数

在 Postgres 中,设置 log_rotation_size 但我的日志仍然没有旋转

我在 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 size disk-space log

3
推荐指数
1
解决办法
1万
查看次数

如何在不使用窗口函数的情况下生成 row_number?

在PostgreSQL中,如何生成行号:

  • 没有窗口函数(如row_number()
  • 没有临时表
  • 只使用一个 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或的数据 …

postgresql

3
推荐指数
3
解决办法
2万
查看次数

有没有更快的方法来计算 JSONB 标签?

我试图在 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

3
推荐指数
1
解决办法
1975
查看次数

条件子查询

我有以下查询:

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 optimization execution-plan subquery explain

3
推荐指数
2
解决办法
1万
查看次数