【问题标题】:Why isn't my table being created in Postgres?为什么我的表没有在 Postgres 中创建?
【发布时间】:2016-02-22 23:05:48
【问题描述】:

我的最终目标是完成一个需要使用临时表的 Postgresql 函数。由于语法错误,尝试创建临时表本身不起作用。我很确定我的语法是正确的,所以有人可以告诉我我在这里做错了什么吗?

在 PGAdmin III 中,我打开一个查询窗口并输入以下内容:

create temporary table tmp_parts
(
  id serial not null,
  part_number character varying(255) not null,
  max_price numeric(19,2) not null
);

当我运行解释查询功能来测试语法时,我收到以下错误:

ERROR:  syntax error at or near "serial"
LINE 3:   id serial not null,
             ^
********** Error **********

ERROR: syntax error at or near "serial"
SQL state: 42601
Character: 98

我做错了什么?

【问题讨论】:

  • 当我在 Postgres 9.3 中运行时,您的查询运行良好。
  • @DJTripleThreat 如果你想“测试语法”,换句话说,在不实际修改数据库的情况下执行查询,但同时在语法好坏时得到警报,你可以在事务中做并回滚它。即:START TRANSACTION; /*then your query*/ ROLLBACK;
  • @Gabriel'sMessanger 谢谢!几分钟前我就知道了。这非常有用。

标签: sql postgresql postgresql-9.3 create-table


【解决方案1】:

serial 实际上不是 postgres 中的类型,它是

的简写

id integer NOT NULL DEFAULT nextval('tmp_parts_seq')

我的“猜测”是它不喜欢 NOT NULL 的重复,或者(更有可能?)你不能有一个临时数字序列,因为它们是临时的。

比我们想象的要简单:

This previous question 显示语法,您需要删除括号并以分号结束语句。

【讨论】:

  • 我也是这么想的,但只需将 serial 更改为 integer 就可以得到类似的结果。
【解决方案2】:

您不能在explain 中使用create table。只允许following

任何 SELECT、INSERT、UPDATE、DELETE、VALUES、EXECUTE、DECLARE 或 CREATE TABLE AS 语句,您希望查看其执行计划。

【讨论】:

  • 哇,真糟糕!在我将它作为一个函数提交之前,我想检查我的代码是否会做一些奇怪的事情。这有点令人沮丧。谢谢你的回答。
  • 原因是没有与创建表相关的执行计划,除非它有一个 DML 查询组件,就像 create table ... AS ... 一样。所以即使它是有效的语法,也不会有解释的计划。
猜你喜欢
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
  • 2014-03-19
  • 2021-02-21
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多