postgresql - 如果表已存在,则根据选择创建临时表或插入

标签 postgresql

如果临时表尚不存在,如何创建临时表并将选定的行添加到其中?

最佳答案

CREATE TABLE AS

是最简单最快的方法:

CREATE TEMP TABLE tbl AS
SELECT * FROM tbl WHERE ... ;

不要使用SELECT INTO。见:

不确定表是否已经存在

CREATE TABLE IF NOT EXISTS ...在 Postgres 9.1 版本中引入。
对于旧版本,请使用此相关答案中提供的功能:

然后:

INSERT INTO tbl (col1, col2, ...)
SELECT col1, col2, ...

很可能,如果临时表已经存在,您的代码就会出错。确保您没有在表格或其他内容中复制数据。或者考虑以下段落......

独特的名字

临时表仅在当前 session 中可见(不要与事务混淆!)。所以表名不能和其他session冲突。 如果您需要在 session 中使用唯一的名称,您可以使用动态 SQL 并利用 SEQUENCE:

创建一次:

CREATE SEQUENCE tablename_helper_seq;

您可以使用 DO 语句(或 plpgsql 函数):

DO
$do$
BEGIN
   EXECUTE
   'CREATE TEMP TABLE tbl' || nextval('tablename_helper_seq'::regclass) || ' AS
    SELECT * FROM tbl WHERE ... ';

   RAISE NOTICE 'Temporary table created: "tbl%"' || ', lastval();
END
$do$;

lastval() and currval(regclass)有助于返回动态创建的表名。

关于postgresql - 如果表已存在,则根据选择创建临时表或插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18850707/

相关文章:

postgresql - Postgres 9.6 更新 jsonb 列以添加具有查询值的新属性

postgresql - 无法为返回 BigInt 的用户定义函数推断 SQL 类型

postgresql - 将 postgis 线串与 GPS 日志进行匹配的有效方法

postgresql - 我可以在 PostgreSQL 8.4 中记录查询执行时间吗?

postgresql - 选择案例 : more than one row returned by a subquery used as an expression

ruby-on-rails - 在 Heroku 应用程序的 AWS RDS 上使用 postgres DB 上的 Controller 时出现问题

java - 如何将postgres脚本传输到hsqldb脚本?

sql - postgres - 如何根据两个数组的 AND 填充一个新数组

sql - 下限 LIMIT/高 OFFSET 的成本非常高

python - 在 PostgreSQL 中为 odoo 更新图像