当前位置: 首页 > 面试题库 >

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

谢鸿羲
2023-03-14
问题内容

我正在使用PostgreSQL,并且是SQL的初学者。我正在尝试从查询创建表,并且如果运行:

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

它工作正常。但是然后如果我添加“如果不存在”并运行:

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

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

ERROR: syntax error at or near "as"

有什么办法吗?


问题答案:

CREATE TABLE AS被认为是与普通CREATE
TABLE
分开的语句,并且 直到Postgres版本9.5
(请参阅changelog条目)不支持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;


 类似资料:
  • 问题内容: 我很沮丧,我不知道该怎么做。 基本上,我只想创建一个表,但是如果它存在,则需要将其删除并重新创建,而不是将其截断,但是如果不存在,则可以创建它。 有人可以帮忙吗? 谢谢乔治 问题答案: 放在tablename您的发言之前。 该语句将删除该表(如果存在),但如果不存在则不会引发错误。

  • 问题内容: 如何编写SQL脚本以在PostgreSQL 9.1中创建ROLE,但如果已经存在则不引发错误? 当前脚本仅具有: 如果用户已经存在,则此操作将失败。我想要类似的东西: …但是那行不通-IF普通的SQL似乎不支持该功能。 我有一个批处理文件,它创建了PostgreSQL 9.1数据库,角色和其他一些东西。它调用psql.exe,并传入要运行的SQL脚本的名称。到目前为止,所有这些脚本都是

  • 问题内容: 创建新表时遇到一些问题。当我使用CREATE TABLE命令时,我的新表将按应有的形式出现,但是当我退出活动时,应用程序崩溃,并且在logcat中得到了一个表已经存在的信息。如果我使用CREATE TABLE IF NOT EXISTS不存在,则不会形成新表,而只是将新的数据行添加到上一个表中,并且不会崩溃。这有什么问题?我想添加没有它的表,让我已经存在,并且我想要添加它而不向其他表添

  • 嗨,我是新来的拉威尔,在理解如何建立人际关系方面有点挣扎。我试图在laravel中创建一个基本的restful api,有3个模型 表迁移: 书籍是主要的表格,作者与书籍有一对多的关系。类别与书籍有多对多的关系,因为一本书可以在多个类别中。 books表有一个author_id字段将其链接到author表。还有一个名为category_books的透视表,它包含category_id和book_i

  • 问题内容: 我正在尝试创建表(如果尚不存在)。我目前正在检查它是否首先存在,并且该查询是否不返回任何内容,然后插入。有没有一种方法可以只检查同一条语句,因此我不必将其分解为单独的查询? 这就是我目前所拥有的。 这是我要的东西。 问题是,您不能在语句中添加一个。 问题答案: 是的,Oracle没有该功能真是可惜。我敢肯定会有一天。在此之前,如果您想编写一个PL / SQL包装器,为什么不那样做:

  • 问题内容: 任何人都可以指出我仅在数据库中当前不存在表时才能使用的正确语法吗? 我目前正在编程Java GUI,以便连接到Oracle并在数据库上执行语句,我想知道是否将其实现为Java约束还是SQLPlus约束。 问题答案: 通常,检查表是否存在没有多大意义,因为不应在运行时创建对象,而应用程序应知道在安装时创建了哪些对象。如果这是安装的一部分,那么您应该知道过程中任何时候存在哪些对象,因此您无