我们正在使用PostgreSQL.我的要求是从我的数据库中删除未使用的序列.例如,如果我通过我的应用程序创建任何表,将创建一个序列,但是为了删除表,我们也不会删除序列.如果要创建同一个表,则会创建另一个序列.
示例:table : file
; 自动创建id
coumn 序列:file_id_seq
当我删除表file
并再次使用相同的名称创建它时,正在创建一个新序列(即file_id_seq1
).我通过这种方式在应用程序数据库中积累了大量未使用的序列.
如何删除这些未使用的序列?
我想在表中添加一个新列,以记录每个元组(行)的值为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函数并且表名是从参数获得的,所以我事先并不知道表的模式.这意味着我需要使用输入表名更新表.有人知道怎么做吗?
我试图在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) 我想检查数据库中是否存在该表.
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) 我对公共模式中所有表的触发器有以下查询:
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) 使用 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) 如何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
我有一个带有长文本列的表.我希望能够选择所有列但限制文本列而无需编写每一列.
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
?
在 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 对象中查找什么,因为它似乎未定义...
我有一个包含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)
列c
并d
在日后添加,初始表创建后.我的问题是:当模式名称被排除在选择查询之外时,为什么数据库会忽略后面的列?
postgresql database-permissions database-schema search-path postgresql-9.2
postgresql ×10
dynamic-sql ×4
plpgsql ×4
boolean ×1
count ×1
ddl ×1
node.js ×1
null ×1
partitioning ×1
psql ×1
psycopg2 ×1
python ×1
search-path ×1
select ×1
sequences ×1
sql ×1
triggers ×1