PostgreSQL执行CREATE TEMP TABLE LIKE语句报错,该关键字是否不可用?
关于PostgreSQL中
CREATE TEMPORARY TABLE ... LIKE报错的问题 嘿,PostgreSQL完全支持用LIKE关键字复制现有表的结构(包括列名、数据类型)来创建临时表,你的语法方向是对的,但报错大概率是某个细节没踩对,我来帮你梳理可能的原因和解决办法:
1. 首先排查源表的存在性与权限
- 最常见的原因是
grades表根本不存在,或者不在当前你使用的schema下。PostgreSQL会抛出类似relation "grades" does not exist的错误,你可以先执行SELECT * FROM grades LIMIT 1;验证表是否能正常访问,必要时加上schema前缀(比如public.grades)。 - 如果你没有读取
grades表的权限,也会触发权限报错,需要确保你对该表拥有SELECT或USAGE权限。
2. 语法本身没问题,但可以按需补充选项
基础语法CREATE TEMPORARY TABLE temporary_table LIKE grades;是合法的,但默认情况下它只会复制列名、数据类型和NOT NULL约束,不会复制主键、外键、索引、列默认值这些属性。如果需要完整复制这些内容,你可以加上选项:
CREATE TEMPORARY TABLE temporary_table LIKE grades INCLUDING ALL;
也可以按需指定要包含的内容:
INCLUDING CONSTRAINTS:复制主键、外键等约束INCLUDING INDEXES:复制索引INCLUDING DEFAULTS:复制列的默认值
3. 注意标识符的大小写问题
PostgreSQL对表名、列名这类标识符的大小写是敏感的——如果你的grades表是用双引号包裹创建的(比如CREATE TABLE "Grades" (...)),那直接用小写grades就会找不到表。这种情况需要用双引号包裹表名:
CREATE TEMPORARY TABLE temporary_table LIKE "Grades";
快速验证语法可行性
你可以先跑个测试来排除环境问题:
- 创建一个测试表:
CREATE TABLE grades (id INT, score NUMERIC, student_name TEXT);
- 执行你的临时表创建语句:
CREATE TEMPORARY TABLE temporary_table LIKE grades;
如果这条能成功执行,说明你的环境本身支持该语法,问题就出在原grades表的存在性、权限或大小写上面。
内容的提问来源于stack exchange,提问作者coldhands
相关产品推荐
相关产品推荐

