PostgreSQL:如果不存在,则创建表格 AS。
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中创建表且如果表已存在则不创建的方法。
在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或其他替代方法来解决。