【问题标题】:CREATE TABLE if not exists based on a SELECT statementCREATE TABLE 如果不存在则基于 SELECT 语句
【发布时间】:2016-06-16 12:55:18
【问题描述】:

如果表不存在,我想根据 PostgreSQL 9.2 中的 select 语句创建一个表。当我使用以下查询时,我收到如下所述的错误。

查询:

CREATE TABLE IF NOT EXISTS ccdb_archival.bills
SELECT *, now() AS archival_date
FROM ccdb.bills
WHERE bill_date::date >= current_date - interval '3 years' AND bill_date::date < current_date - interval '8 years';

错误:

ERROR:  syntax error at or near "SELECT"
LINE 2:  SELECT *, now() AS archival_date

有人可以建议我如何实现这一目标。

【问题讨论】:

  • 您可以升级到 9.5。该版本增加了使用if not existscreate table as select 的可能性
  • 在 9.2 中还有其他方法吗?
  • 看看this
  • 除了旧表中的现有列之外,我还需要新表中的一个额外列。

标签: postgresql create-table


【解决方案1】:

我确实为此找到了替代品。我使用了下面提到的代码。

CREATE OR REPLACE FUNCTION ccdb_archival.ccdb_archival()
 RETURNS void AS
$BODY$
BEGIN

CREATE TABLE IF NOT EXISTS ccdb_archival.bills (LIKE ccdb.bills INCLUDING ALL);
    BEGIN
        ALTER TABLE ccdb_archival.bills ADD COLUMN archival_date timestamp;
    EXCEPTION
        WHEN duplicate_column THEN RAISE NOTICE 'column archival_date already exists in ccdb_archival.bills.';
    END;

INSERT INTO ccdb_archival.bills
SELECT *, now() AS archival_date
FROM ccdb.bills
WHERE bill_date::date >= current_date - interval '3 years' AND bill_date::date < current_date - interval '8 years';


END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

【讨论】:

    猜你喜欢
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2012-02-13
    • 2021-01-05
    • 2017-08-07
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多