PostgreSQL:如果不存在,则创建表格 AS。

12 浏览
0 Comments

PostgreSQL:如果不存在,则创建表格 AS。

我正在使用PostgreSQL,是一个SQL初学者。我试图从查询中创建一个表,如果我运行:

CREATE TABLE table_name AS
   (....query...)

它工作得很好。但是,如果我添加'if not exists'并运行:

CREATE TABLE IF NOT EXISTS table_name AS
   (....query...)

使用完全相同的查询,我得到:

ERROR: syntax error at or near "as"

有没有办法做到这一点?

0
0 Comments

PostgreSQL: Create table if not exists AS

在PostgreSQL 9.1中引入了CREATE TABLE IF NOT EXISTS ...命令。如果要在旧版本的PostgreSQL中实现这个功能,可以基于系统目录表pg_class来编写函数,而不是依赖于信息模式或统计收集器的视图(只有在激活的情况下存在)。

下面是一个用于创建表的函数示例:

CREATE OR REPLACE FUNCTION create_table_qry(_tbl text, _qry text, _schema text = NULL)
  RETURNS bool
  LANGUAGE plpgsql AS
$func$
DECLARE
   _sch text := COALESCE(_schema, current_schema());
BEGIN
   IF EXISTS (
      SELECT FROM pg_catalog.pg_class c
      JOIN   pg_catalog.pg_namespace n ON n.oid = c.relnamespace
      WHERE  n.nspname = _sch
      AND    c.relname = _tbl
      ) THEN
      RAISE NOTICE 'Name is not free: %.%',_sch, _tbl;
      RETURN  FALSE;
   ELSE
      EXECUTE format('CREATE TABLE %I.%I AS %s', _sch, _tbl, _qry);
      RAISE NOTICE 'Table created successfully: %.%',_sch, _tbl;
      RETURN  TRUE;
   END IF;
END
$func$;

这个函数接受一个表名和查询字符串作为参数,并可选地指定要在其中创建表的模式(默认为当前模式)。

函数中使用了正确的=操作符和:=赋值操作符。在函数体中,标识符被转义为标识符形式。由于表尚不存在,因此不能使用regclass

以上就是实现在PostgreSQL中创建表且如果表已存在则不创建的方法。

0
0 Comments

在PostgreSQL的版本9.5之前,CREATE TABLE AS被认为是与普通CREATE TABLE不同的语句,并且不支持IF NOT EXISTS子句。因此,可以使用CREATE TABLE ... LIKE语法作为替代方法,它从另一个表或视图复制结构,而不是从SELECT语句复制结构和内容。

以下是一个示例代码,其中包含了对已存在表进行插入操作的处理:

CREATE OR REPLACE VIEW source_data AS SELECT * FROM foo NATURAL JOIN bar;
CREATE TABLE IF NOT EXISTS snapshot LIKE source_data;
INSERT INTO snapshot
SELECT * FROM source_data
WHERE NOT EXISTS ( SELECT * FROM snapshot );

另外,如果你想要删除先前的数据(例如废弃的临时表),可以有条件地删除旧表,并无条件地创建新表:

DROP TABLE IF EXISTS temp_stuff;
CREATE TEMPORARY TABLE temp_stuff AS SELECT * FROM foo NATURAL JOIN bar;

如果你要创建一个视图以便复制表结构,你可以考虑使用MATERIALIZED VIEW。然而,MATERIALIZED VIEW也不支持IF NOT EXISTS子句,但你可以使用DROP MATERIALIZED VIEW IF EXISTS来删除视图。根据具体的用例,很难确定这些选项是否实际相关。

需要注意的是,支持特定功能的PostgreSQL版本需要进行明确声明,因为MATERIALIZED VIEW支持PostgreSQL版本9.3及以上版本。

在撰写本文时,CREATE TABLE AS还不支持该选项,它似乎是在9.5版本中添加的。因此,对于运行最新版本的幸运用户,我应该更新答案。如果在9.4版本上使用CREATE TABLE IF NOT EXISTS ... AS时遇到问题,可能是因为该功能尚未添加。

总结一下,CREATE TABLE AS在旧版本的PostgreSQL中不支持IF NOT EXISTS子句的问题可以通过使用CREATE TABLE ... LIKE或其他替代方法来解决。

0