标签: postgresql

UPSERT 函数中的复合类型问题

我在 PostgreSQL 9.1 中有一个名为fun_test. 它有一个复合类型作为输入参数,我在调用它时不断收到转换错误。

CREATE OR REPLACE FUNCTION netcen.fun_test(myobj netcen.testobj)
  RETURNS boolean AS
$BODY$
DECLARE 
tmp_code smallint;
cur_member refcursor;
BEGIN
-- Check if the member exists first
OPEN cur_member FOR 
EXECUTE 'SELECT testkey FROM netcen.test WHERE testkey=' || myobj.testkey ;
FETCH cur_member INTO tmp_code;
CLOSE cur_member;
CASE tmp_code
    WHEN COALESCE(tmp_code,0)=0 THEN
    -- Record not found INSERT a new record
    -- will skip user defined validation for now
    insert into netcen.test values(myobj.testkey,
    myobj.tes,
    myobj.testname);

    ELSE
    -- Record found …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql postgresql-9.1 upsert

7
推荐指数
2
解决办法
895
查看次数

使用 GIN 索引位串

我正在尝试将 PostgreSQL 扩展为索引位串最多 1000 位。(这些位串是通过量化高维向量创建的,因此每个维度最多分配 4 位)。插入很少见,而搜索是最常用的操作。在搜索中,我想获取与位字符串完全匹配的所有行。

对于 GIN 来说,这看起来是一个完美的工作(结合我自己的数据类型),或者你怎么看?

postgresql performance index index-tuning postgresql-performance

7
推荐指数
1
解决办法
3536
查看次数

为什么 PostgreSQL 选择大象作为它的标志?

为什么 PostgreSQL 选择大象作为它的标志?从logo wiki 中不清楚

更新:现在维基更新:) 谢谢!

postgresql

7
推荐指数
2
解决办法
2778
查看次数

GROUP BY 和 ORDER BY 问题

我有两张这样的表:

CREATE TABLE cmap5 (
   name     varchar(2000),
   lexemes  tsquery
);
Run Code Online (Sandbox Code Playgroud)

CREATE TABLE IF NOT EXISTS synonyms_all_gin_tsvcolumn (
   cid       int NOT NULL,  -- REFERENCES pubchem_compounds_index(cid)
   name      varchar(2000) NOT NULL,  
   synonym   varchar(2000) NOT NULL,
   tsv_syns  tsvector,
   PRIMARY KEY (cid, name, synonym)
);
Run Code Online (Sandbox Code Playgroud)

我目前的查询是:

SELECT s.cid, s.synonym, c.name, ts_rank(s.tsv_syns,c.lexemes,16) 
FROM synonyms_all_gin_tsvcolumn s, cmap5 c
WHERE c.lexemes @@ s.tsv_syns
Run Code Online (Sandbox Code Playgroud)

输出是:

cid     |  synonym                              | name (query)              | rank
5474706 | 10-Methoxyharmalan                    | 10-methoxyharmalan        | 0.0901673
1416    | (+/-)12,13-EODE                       | 12,13-EODE                | 0.211562
5356421 …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate full-text-search group-by greatest-n-per-group

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

PostgreSQL 数据库存储在我的计算机上的什么位置?

所以这可能是一个愚蠢的问题,但我真的很陌生。所以我在 postgres 服务器上创建一个 Postgres 数据库,我用这个命令启动:

sudo -u postgres psql
Run Code Online (Sandbox Code Playgroud)

然后我做了以下命令:

CREATE DATABASE database;
Run Code Online (Sandbox Code Playgroud)

据说创建了数据库。但是这个数据库在哪里?我在哪里可以在我的电脑上找到它?

postgresql

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

PostgreSql 中的表继承是否适合这种情况?

首先让我们说,我是 PSQL 的新手并且来自 MSSQL 背景。我开始在 PSQL 中设计一个数据库。

所以我的主要目标是在这个数据库中有一个主模式,我将用它来控制某些服务,并有多个模式链接到这个,这将是不同的客户端数据。

我已经阅读了表继承,但从来没有遇到过任何人使用继承的效果类似于 DB Migrations 的效果。我想要实现的基本上是有一个默认架构,客户端架构都继承自默认架构。这对我来说,只需更改一个模式,就可以控制创建/删除/更改所有模式的对象。

这可行吗?有没有其他人有过做类似事情的经验?有人有什么建议吗?

更新

这就是我所做的。但是,我的印象是,如果您查看下面的代码,我需要做的就是模式“client1”,但是我错了。:D

所以无论如何,下面是我所做的脚本,它应该处理我现在需要的一切 - 我将使用脚本作为“client2”模式。是好是坏?

-- public schema --
CREATE TABLE public.Users (
   Id bigserial primary key,
   Login text unique,
   check (false) NO INHERIT 
);

CREATE TABLE public.Roles (
   Id bigserial primary key,
   RoleName text unique,
   check (false) NO INHERIT 
);

CREATE TABLE public.UserRoles (
   Id bigserial primary key,
   UserId bigint references users(id),
   RoleId bigint references roles(id),
   unique (UserId, RoleId),
   check (false) NO INHERIT 
);


-- client1 …
Run Code Online (Sandbox Code Playgroud)

schema postgresql database-design

7
推荐指数
1
解决办法
4635
查看次数

PostgreSQL 存储过程返回行或空集

我有一个存储过程,RETURNS SETOF ct_custom_type我在里面做

RETURN QUERY EXECUTE 'some dynamic query'
Run Code Online (Sandbox Code Playgroud)

我想这样做:如果这个“动态查询”返回 >= 10 行,我想返回它们,但如果它只返回 < 10 行,我不想返回任何东西(空集ct_custom_type)。

我试过:

RETURN QUERY EXECUTE 'some dynamic query'

GET DIAGNOSTICS variable = ROW_COUNT;
IF variable < 10 THEN

    # I don't know what to do here or how to accomplish this

END IF;
Run Code Online (Sandbox Code Playgroud)

如果我RETURN QUERY SELECT 0, 0, ''::text;IF块中执行(因为ct_custom_type是 的复合类型(integer, integer, text),它只是将这个“空行”添加到先前的查询结果中,但在这种情况下我不想返回任何内容,我可以这样做RETURN;,但它会返回先前的结果,我想丢弃它。

我有这样的:

EXECUTE 'dynamic query';

GET DIAGNOSTICS variable = ROW_COUNT; …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql plpgsql functions

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

在 PostgreSQL 中恢复删除的表

我有 :

CREATE TABLE ketoan_vn.Customers
(
  CustomerId character varying(10) NOT NULL,
  CustomerName character varying(150),
  CONSTRAINT Customers_PK_CustomerID PRIMARY KEY (CustomerId)
);
Run Code Online (Sandbox Code Playgroud)

我在表 ketoan_vn.Customers 中插入了 2 行:

INSERT INTO ketoan_vn.customers(
            customerid, customername)
    VALUES ('C0001','Marry'),
    ('C0002','Tom');
Run Code Online (Sandbox Code Playgroud)

然后我删除了 ketoan_vn.Customers :

drop table ketoan_vn.Customers
Run Code Online (Sandbox Code Playgroud)

现在我想恢复被删除的表的数据。PostgreSQL 9.1 可以做到这一点吗?

postgresql

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

为更长的数值创建序列

我需要创建一个database model包含一个字段来存储 20 位唯一值的字段。许多客户端将通过 API 使用它。

该值必须为 20 位长、数字且唯一。最好的方法似乎是创建一个自动增量big-int字段,但 big-int 支持的值最大为 9223372036854775807(19 位)。使用numeric(20,0)是无用的,因为尽管数字支持更大的值,但 Postgres 8.4 不允许我创建sequence并引发错误

CREATE SEQUENCE my_sequence_name INCREMENT BY 1 NO MINVALUE NO MAXVALUE START WITH 10000000000000000101;
Run Code Online (Sandbox Code Playgroud)

错误:值“10000000000000000101”超出 bigint 类型的范围

为了数据完整性,我必须在 POstgresql 中处理这个问题。处理这个问题的有效方法是什么?

我正在使用 Postgresql 8.4 和 Django 1.3

更新:我想最好澄清一下......我试图找到一种在 DBMS 中解决这个问题的方法。因此,除非我别无选择,否则将避免任何非数据库解决方案。休息是我的问题的原因:

我正在制作一个与银行通信以进行 3D 安全操作的 API。银行 API 需要一个20 位的唯一数字标识符来进行交易,所以我决定创建一个 ID 值,我可以将它用于银行 API 和将使用该表等的API

说明10000000000000000101是因为,银行 API 希望它是一个有效的20 位数字 …

postgresql auto-increment postgresql-8.4

7
推荐指数
1
解决办法
2642
查看次数

带有 JOIN 和 GROUP BY 查询的 SELECT 中的错误“列不存在”

我将 PostgreSQL 9.1 与 Ruby on Rails 应用程序一起使用。

我正在尝试列出属于同一项目 ID (proj_sous_projet_id = 2) 的每个“费用”(在我的历史表中:hist_version_charges)的最后一个版本。

这使我使用 max() 聚合函数并将结果应用于同一个表上的 JOIN 函数,因为如果 SELECT 子句中的列未出现在 GROUP BY 子句中,则 PostgreSQL 没有授权使用它们,但使用最大值() 显然我对包含最大值的行感兴趣!

这是我的查询:

SELECT h_v_charges.*, 
       max(last_v.version) as lv 
FROM hist_versions_charges h_v_charges 
    JOIN hist_versions_charges last_v 
      ON h_v_charges.version = lv 
    AND h_v_charges.proj_charge_id = last_v.proj_charge_id 
GROUP BY last_v.proj_sous_projet_id, 
         last_v.proj_charge_id 
HAVING last_v.proj_sous_projet_id = 2 
ORDER BY h_v_charges.proj_charge_id ASC;
Run Code Online (Sandbox Code Playgroud)

我得到的错误信息:

ERROR:  column "lv" does not exist
LINE 1: ..._versions_charges last_v ON h_v_charges.version = lv AND h_v...
                                                             ^
********** Error ********** …
Run Code Online (Sandbox Code Playgroud)

postgresql join select group-by

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