相关疑难解决方法(0)

如何删除未使用的序列?

我们正在使用PostgreSQL.我的要求是从我的数据库中删除未使用的序列.例如,如果我通过我的应用程序创建任何表,将创建一个序列,但是为了删除表,我们也不会删除序列.如果要创建同一个表,则会创建另一个序列.

示例:table : file; 自动创建idcoumn 序列:file_id_seq

当我删除表file并再次使用相同的名称创建它时,正在创建一个新序列(即file_id_seq1).我通过这种方式在应用程序数据库中积累了大量未使用的序列.

如何删除这些未使用的序列?

postgresql ddl sequences

6
推荐指数
1
解决办法
9389
查看次数

计算行的NULL属性数

我想在表中添加一个新列,以记录每个元组(行)的值为null的属性数.如何使用SQL获取数字?

例如,如果元组是这样的:

Name | Age | Sex
-----+-----+-----
Blice| 100 | null
Run Code Online (Sandbox Code Playgroud)

我想更新元组,如下所示:

Name | Age | Sex | nNULL
-----+-----+-----+--------
Blice| 100 | null|  1
Run Code Online (Sandbox Code Playgroud)

另外,因为我正在编写PL/pgSQL函数并且表名是从参数获得的,所以我事先并不知道表的模式.这意味着我需要使用输入表名更新表.有人知道怎么做吗?

sql postgresql null count plpgsql

6
推荐指数
1
解决办法
950
查看次数

SELECT ... INTO的EXECUTE未实现

我试图在PostrgeSQL中运行此函数:

CREATE OR REPLACE FUNCTION create_partition_and_insert()
RETURNS trigger AS
$BODY$
DECLARE
partition VARCHAR(25);
_date text;
BEGIN
EXECUTE 'SELECT REPLACE(' || quote_literal(NEW.date) || ',''-'',''_'') into _date';
partition := TG_RELNAME || '_' || _date || ‘p’;
IF NOT EXISTS(SELECT relname FROM pg_class WHERE relname=partition) THEN
RAISE NOTICE 'A partition has been created %',partition;
EXECUTE 'CREATE TABLE ' || partition || ' (check (date = ''' || NEW.date || ''')) INHERITS (' || TG_RELNAME || ');';
END IF;
EXECUTE 'INSERT INTO ' || …
Run Code Online (Sandbox Code Playgroud)

postgresql triggers partitioning dynamic-sql plpgsql

6
推荐指数
1
解决办法
4004
查看次数

PostgreSQL 9.3:IF NOT NOT EXISTS

我想检查数据库中是否存在该表.

IF NOT EXISTS (SELECT * from INFORMATION_SCHEMA.Tables WHERE Table_name = 'test') THEN

    RAISE INFO 'Not exists';

else

    RAISE INFO 'Exists';

end if;
Run Code Online (Sandbox Code Playgroud)

得到错误:

ERROR:  syntax error at or near "IF"
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.3

5
推荐指数
1
解决办法
3594
查看次数

检查触发器是否存在

我对公共模式中所有表的触发器有以下查询:

SELECT 'CREATE TRIGGER ' || tab_name|| '_if_modified_trg INSERT OR UPDATE OR DELETE ON  ' || tab_name|| ' FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); ' AS trigger_creation_query
FROM (
   SELECT quote_ident(table_schema) || '.' || quote_ident(table_name) as  tab_name
   FROM information_schema.tables
   WHERE table_schema='public'
   ) AS foo;
Run Code Online (Sandbox Code Playgroud)

我知道如何检查触发器是否存在:

SELECT tgname
from pg_trigger
where not tgisinternal AND tgname='randomname'
Run Code Online (Sandbox Code Playgroud)

但是,如何在第一个查询中检查同名触发器是否已存在 - 并跳过创建它并继续?这是我的解决方案,但它不起作用:

SELECT 'CREATE TRIGGER ' || tab_name|| '_if_modified_trg INSERT OR UPDATE OR DELETE ON  ' || tab_name|| ' FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql plpgsql database-trigger

5
推荐指数
2
解决办法
7628
查看次数

测试 PostgreSQL 表是否不存在(使用 psycopg2)

使用 Psycopg2,我需要测试 postgresql 表是否存在。

在类似的问题中,建议使用以下测试:

cursor.execute("select exists(select * from myDb.mytable_%s)" % complementName)
tableExists = cursor.fetchone()[0]
print(tableExists)
Run Code Online (Sandbox Code Playgroud)

如果表已经存在,并且返回 ,则此方法非常有效,但如果表True存在,则此方法不起作用。我没有像我需要的那样返回,而是收到错误False

编程错误:关系“myDb.mytable_001”不存在

我究竟做错了什么?False 如果表不存在,我应该怎么做才能得到语句?谢谢你的帮助!

编辑

根据评论中的建议,我也尝试过:

tableExists = cursor.execute("SELECT 1 AS result FROM pg_database WHERE datname='mytable_001'")
Run Code Online (Sandbox Code Playgroud)

tableExists = cursor.execute("SELECT EXISTS (SELECT 1 AS result FROM pg_tables WHERE schemaname = 'mySchema' AND tablename = 'mytable_001)')")
Run Code Online (Sandbox Code Playgroud)

None无论表是否存在,两者都只是返回 。但是,我不确定语法,也许你可以指出我可能犯的一些新手错误?谢谢!

编辑2 最后,解决方案包括上面后一个查询的组合,并按如下方式获取布尔结果:

cursor.execute("SELECT EXISTS (SELECT 1 AS result FROM pg_tables WHERE schemaname = 'mySchema' AND tablename = …
Run Code Online (Sandbox Code Playgroud)

python postgresql boolean psycopg2

5
推荐指数
1
解决办法
3971
查看次数

PL / pgSQL函数中的动态SELECT INTO

如何SELECT INTO在Postgres的PL / pgSQL函数内编写动态查询?

假设我有一个名为的变量tb_name,它填充在的FOR循环中information_schema.tables。现在,我有一个名为的变量tc,它将获取每个表的行数。我想要以下内容:

FOR tb_name in select table_name from information_schema.tables where table_schema='some_schema' and table_name like '%1%'
LOOP
EXECUTE FORMAT('select count(*) into' || tc 'from' || tb_name);
END LOOP
Run Code Online (Sandbox Code Playgroud)

应该是什么数据类型tb_name,并tc在这种情况下?

postgresql dynamic-sql plpgsql variable-assignment stored-functions

5
推荐指数
1
解决办法
5155
查看次数

默认情况下在postgres psql select语句中截断显示

我有一个带有长文本列的表.我希望能够选择所有列但限制文本列而无需编写每一列.

select * from resources;
Run Code Online (Sandbox Code Playgroud)

产生的输出太长而无法在psql中正确显示.我可以通过使用substr()left()在长列上显示某些内容,但之后我需要指定每列.

select id, left(data, 50), file_format_version, ... from resources;
Run Code Online (Sandbox Code Playgroud)

当我查询第一个时,是否有一种方法可以让psql默认截断长列select * from resources

postgresql select dynamic-sql psql

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

如何检查表是否存在?

在 db/index.js 中:

const { Pool } = require('pg'); //node-postgres
const pool = new Pool;

module.exports = {
    query: (text, params, callback) => {
        return pool.query(text,params,callback);
    }
};
Run Code Online (Sandbox Code Playgroud)

在我的 main.js 中:

const db = require('./db/index');

    db.query('SELECT count(*) from pg_class where relname ="session" and relkind="r"', (err, res) => {
        if (err) {
          //TODO: What to do if there is an error?
        }
        console.log(res);
    });
Run Code Online (Sandbox Code Playgroud)

输出是:

不明确的

如何检查名称为“session”的表是否存在?我怎么知道我的查询是否有效?

编辑:这不是上述问题的重复,因为我的问题与 Node.js javascript 代码有关。不是 SQL!我只想知道要在 res 对象中查找什么,因为它似乎未定义...

postgresql node.js node-postgres

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

为什么PostgreSQL SELECT查询在指定模式名称时会返回不同的结果?

我有一个包含4列的PostgreSQL数据库表 - 标记为column_a,column_b等.我想用简单的select查询查询此表:

select * from table_name;
Run Code Online (Sandbox Code Playgroud)

我得到了一些看起来像的结果:

column_a | column_b
---------+---------
'a value'|'b_value'
Run Code Online (Sandbox Code Playgroud)

但是当我使用这个查询时:

select * from schema_name.table_name;
Run Code Online (Sandbox Code Playgroud)

我得到了完整的结果:

column_a | column_b | column_c | column_d
---------+----------+----------+---------
'a value'|'b value' |'c value' |'d_value' 
Run Code Online (Sandbox Code Playgroud)

cd在日后添加,初始表创建后.我的问题是:当模式名称被排除在选择查询之外时,为什么数据库会忽略后面的列?

postgresql database-permissions database-schema search-path postgresql-9.2

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