2016-06-28 3 views
2

Я пытаюсь создать новую таблицу и продолжать получать syntax error at or near "CONSTRAINT" в приведенной ниже инструкции. Я уже убедился, что у меня есть , после последнего объявляемого столбца, который равен Tags прямо над линией CONSTRAINT. Кто-нибудь знает, почему это происходит? Все онлайн-примеры объявления ограничений, по-видимому, включают в себя инструкции CREATE TABLE, а не инструкции CREATE TABLE AS. Это имеет значение? Спасибо за вашу помощь!Синтаксис Ошибка в или рядом с «CONSTRAINT» PostgreSQL

Кстати, строка ограничения ниже была скопирована/вставлена ​​из уже созданной таблицы, в которой использовался оператор CREATE TABLE, а не оператор CREATE TABLE AS, поэтому я спрашиваю, не связаны ли ограничения с CREATE TABLE AS.

CREATE TABLE "2017Projects" AS 
SELECT 
    "STAGING_PROJECTS"."_PROJECT_NUMBER", 
    "STAGING_PROJECTS"."_PROJECT_DESCRIPTION", 
    "STAGING_PROJECTS"."_PROJECT_STATUS", 
    "STAGING_PROJECTS"."_TEMPLATE_FLAG", 
    "STAGING_PROJECTS"."_PROJECT_START_DATE", 
    "STAGING_PROJECTS"."_PROJECT_COMPLETION_DATE", 
    "STAGING_PROJECTS"."_COMPANY", 
    "STAGING_PROJECTS"."_LOCATION_NUMBER", 
    "STAGING_TASKS"."_PARENT_TASK_NUMBER", 
    "STAGING_TASKS"."_PARENT_TASK_DESCRIPTION", 
    "STAGING_TASKS"."_TASK_NUMBER", 
    "STAGING_TASKS"."_TASK_DESCRIPTION", 
    "STAGING_TASKS"."_TASK_START_DATE", 
    "STAGING_TASKS"."_TASK_COMPLETION_DATE", 
    "STAGING_TASKS"."_EBS_ACCOUNT", 
    "STAGING_TASKS"."_FUSION_ACCOUNT", 
    CASE 
     WHEN left("STAGING_PROJECTS"."_PROJECT_NUMBER",2) = 'C0' THEN 
      '('||"STAGING_PROJECTS"."_PROJECT_NUMBER"||') '||"STAGING_PROJECTS"."_PROJECT_DESCRIPTION" 
     ELSE 
      "STAGING_PROJECTS"."_PROJECT_DESCRIPTION" 
    END AS "Project", 
    '('||"STAGING_TASKS"."_TASK_NUMBER"||') '||"STAGING_TASKS"."_TASK_DESCRIPTION" AS "Task", 
    NULL AS "Investment_Priority", 
    NULL AS "Class", 
    NULL AS "Tags", 

    --ERROR ON NEXT LINE HERE!!! 
    CONSTRAINT "2017Projects_pk" PRIMARY KEY ("_PROJECT_NUMBER", "_TASK_NUMBER") 
FROM 
    "STAGING_PROJECTS"; 

ответ

2

Вам нужно добавить ограничение, используя второе утверждение:

CREATE TABLE "2017Projects" AS 
SELECT 
    "STAGING_PROJECTS"."_PROJECT_NUMBER", 
    ..., 
    NULL AS "Tags" 
FROM 
    "STAGING_PROJECTS"; 

ALTER TABLE "2017Projects" ADD CONSTRAINT "2017Projects_pk" 
    PRIMARY KEY ("_PROJECT_NUMBER", "_TASK_NUMBER") 

В CREATE TABLE и ALTER TABLE заявления должны работать в одной транзакции.

Пожалуйста, просмотрите this great Stack DBA article, с именем @a_horse_with_no_name.

+1

Для справки: https://www.postgresql.org/docs/9.5/static/sql-createtableas.html. В разделе 'create table as select' нет' 'ограничения' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. –

+0

@ RadekPostołowicz Простите, пропустил это по какой-то причине. Я искал 'CREATE TABLE AS' и по какой-то причине видел только документацию' CREATE TABLE', которая показывает раздел 'constraint'. – christopheralan88

+1

@TimBiegeleisen Спасибо, я думал, что могу это сделать, но надеялся, что есть способ сделать это в инструкции 'CREATE TABLE AS'. Спасибо за вашу помощь! – christopheralan88