我在 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 扩展为索引位串最多 1000 位。(这些位串是通过量化高维向量创建的,因此每个维度最多分配 4 位)。插入很少见,而搜索是最常用的操作。在搜索中,我想获取与位字符串完全匹配的所有行。
对于 GIN 来说,这看起来是一个完美的工作(结合我自己的数据类型),或者你怎么看?
postgresql performance index index-tuning postgresql-performance
为什么 PostgreSQL 选择大象作为它的标志?从logo wiki 中不清楚。
更新:现在维基更新:) 谢谢!
我有两张这样的表:
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
所以这可能是一个愚蠢的问题,但我真的很陌生。所以我在 postgres 服务器上创建一个 Postgres 数据库,我用这个命令启动:
sudo -u postgres psql
Run Code Online (Sandbox Code Playgroud)
然后我做了以下命令:
CREATE DATABASE database;
Run Code Online (Sandbox Code Playgroud)
据说创建了数据库。但是这个数据库在哪里?我在哪里可以在我的电脑上找到它?
首先让我们说,我是 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) 我有一个存储过程,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) 我有 :
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 可以做到这一点吗?
我需要创建一个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 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 ×10
group-by ×2
plpgsql ×2
aggregate ×1
dynamic-sql ×1
functions ×1
index ×1
index-tuning ×1
join ×1
performance ×1
schema ×1
select ×1
upsert ×1