如何创建一个临时表,如果它不存在,并添加选定的行到它?
mwyxok5s1#
CREATE TABLE AS
是最简单、最快捷的方法:
CREATE TEMP TABLE tbl AS SELECT * FROM tbl WHERE ... ;
字符串不要将SELECT INTO用于此目的。请参阅:
SELECT INTO
CREATE TABLE IF NOT EXISTS ...是在Postgres 9.1中添加的。对于旧版本,请参阅:
CREATE TABLE IF NOT EXISTS ...
然后又道:
INSERT INTO tbl (col1, col2, ...) SELECT col1, col2, ...
型如果临时表已经存在,那么很有可能是代码中出现了问题。请确保表中没有重复数据或其他内容。或者考虑以下段落...
临时表只在当前会话中可见(不要与transaction混淆!)。因此表名不能与其他会话冲突。* 如果 * 您需要在会话中使用唯一的名称,您可以使用动态SQL并使用SEQUENCE:创建一次:
SEQUENCE
CREATE SEQUENCE tablename_helper_seq;
型您可以使用DO语句(或plpgsql函数):
DO
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)用于返回动态创建的表名。
lastval()
currval(regclass)
1条答案
按热度按时间mwyxok5s1#
CREATE TABLE AS
是最简单、最快捷的方法:
字符串
不要将
SELECT INTO
用于此目的。请参阅:不确定表是否已存在
CREATE TABLE IF NOT EXISTS ...
是在Postgres 9.1中添加的。对于旧版本,请参阅:然后又道:
型
如果临时表已经存在,那么很有可能是代码中出现了问题。请确保表中没有重复数据或其他内容。或者考虑以下段落...
唯一名称
临时表只在当前会话中可见(不要与transaction混淆!)。因此表名不能与其他会话冲突。* 如果 * 您需要在会话中使用唯一的名称,您可以使用动态SQL并使用
SEQUENCE
:创建一次:
型
您可以使用
DO
语句(或plpgsql函数):型
lastval()
andcurrval(regclass)
用于返回动态创建的表名。