我在我的Mac OS Lion上安装了PostgreSQL,正在开发一个rails应用程序.我使用RVM将所有内容与其他Rails应用程序分开.
出于某种原因,当我第一次尝试迁移数据库时,rake无法找到postgres用户.我收到了错误
FATAL: role "postgres" does not exist
Run Code Online (Sandbox Code Playgroud)
我有pgAdmin所以我可以清楚地看到数据库中有一个postgres用户 - 实际上是管理员帐户 - 所以我不知道还能做什么.
我在某处读过有关PostgreSQL问题的人,因为它安装了哪条路径,但是如果它找不到db那么我认为我不会那么远.
关于LIKE查询数据库中特定表的响应时间,我看到了相当大的变化.有时我会在200-400毫秒内得到结果(非常可接受),但有时候返回结果可能需要30秒.
我知道LIKE查询是非常耗费资源的,但我只是不明白为什么响应时间会有这么大的差异.我已经在该owner1字段上构建了一个btree索引,但我认为这对LIKE查询没有帮助.有人有主意吗?
示例SQL:
SELECT gid, owner1 FORM parcels
WHERE owner1 ILIKE '%someones name%' LIMIT 10
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
SELECT gid, owner1 FROM parcels
WHERE lower(owner1) LIKE lower('%someones name%') LIMIT 10
Run Code Online (Sandbox Code Playgroud)
和:
SELECT gid, owner1 FROM parcels
WHERE lower(owner1) LIKE lower('someones name%') LIMIT 10
Run Code Online (Sandbox Code Playgroud)
有类似的结果.
表行数:约95,000.
postgresql indexing query-optimization pattern-matching sql-like
我想知道"位图堆扫描"的原理,我知道当我OR在条件中执行查询时经常发生这种情况.
谁能解释"位图堆扫描"背后的原理?
我正在使用pgAdmin版本1.14.3.PostgreSQL数据库版本是9.1.
我为表创建了所有Db脚本但无法导出表中的所有数据.找不到以db脚本形式导出数据的任何选项.
如何编写一个SQL脚本来在PostgreSQL 9.1中创建一个ROLE,但如果它已经存在则不会引发错误?
当前脚本只有:
CREATE ROLE my_user LOGIN PASSWORD 'my_password';
Run Code Online (Sandbox Code Playgroud)
如果用户已存在,则会失败.我喜欢这样的东西:
IF NOT EXISTS (SELECT * FROM pg_user WHERE username = 'my_user')
BEGIN
CREATE ROLE my_user LOGIN PASSWORD 'my_password';
END;
Run Code Online (Sandbox Code Playgroud)
...但是这不起作用 - IF在纯SQL中似乎不支持.
我有一个批处理文件,可以创建PostgreSQL 9.1数据库,角色和其他一些东西.它调用psql.exe,传入要运行的SQL脚本的名称.到目前为止,所有这些脚本都是纯SQL,我想尽可能避免使用PL/pgSQL等.
我必须为现有表添加唯一约束.这很好,除了表已经有数百万行,并且许多行违反了我需要添加的唯一约束.
删除有问题的行的最快方法是什么?我有一个SQL语句,它找到重复项并删除它们,但它需要永远运行.有没有其他方法可以解决这个问题?也许备份表,然后在添加约束后恢复?
sql postgresql duplicate-removal unique-constraint sql-delete
是否可以在PostgreSQL中搜索每个表的每一列中的特定值?
Oracle 提供了类似的问题.
我在PostgreSQL中有这个功能,但我不知道如何返回查询结果:
CREATE OR REPLACE FUNCTION wordFrequency(maxTokens INTEGER)
RETURNS SETOF RECORD AS
$$
BEGIN
SELECT text, count(*), 100 / maxTokens * count(*)
FROM (
SELECT text
FROM token
WHERE chartype = 'ALPHABETIC'
LIMIT maxTokens
) as tokens
GROUP BY text
ORDER BY count DESC
END
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
但我不知道如何在PostgreSQL函数中返回查询结果.
我发现返回类型应该是SETOF RECORD,对吗?但是返回命令不对.
这样做的正确方法是什么?
我想创建一个通过JDBC不存在的数据库.与MySQL不同,PostgreSQL不支持create if not exists语法.完成此任务的最佳方法是什么?
应用程序不知道数据库是否存在.它应该检查,如果数据库存在,应该使用它.因此,连接到所需数据库是有意义的,如果由于数据库不存在而导致连接失败,则应创建新数据库(通过连接到默认postgres数据库).我检查了Postgres返回的错误代码,但我找不到任何相同的相关代码.
实现此目的的另一种方法是连接到postgres数据库并检查是否存在所需的数据库并相应地采取措施.第二个是锻炼有点乏味.
有什么方法可以在Postgres中实现这个功能吗?
我需要知道表中的行数来计算百分比.如果总计数大于某个预定义常量,我将使用常量值.否则,我将使用实际的行数.
我可以用SELECT count(*) FROM table.但是如果我的常量值是500,000并且我的表中有5,000,000,000行,那么计算所有行会浪费很多时间.
一旦超过常数值,是否可以停止计数?
只要它低于给定的限制,我只需要确切的行数.否则,如果计数高于限制,我会使用限制值,并希望尽快得到答案.
像这样的东西:
SELECT text,count(*), percentual_calculus()
FROM token
GROUP BY text
ORDER BY count DESC;
Run Code Online (Sandbox Code Playgroud) postgresql ×10
sql ×5
database ×2
indexing ×2
count ×1
ddl ×1
dynamic-sql ×1
export ×1
grep ×1
jdbc ×1
pgadmin ×1
plpgsql ×1
rake ×1
return ×1
return-type ×1
roles ×1
row ×1
sql-delete ×1
sql-like ×1