2016-06-28 6 views
2

새로운 테이블을 만들고 아래 문에서 syntax error at or near "CONSTRAINT"을 계속 가져 오려고합니다. 나는 내가 선언 한 마지막 컬럼 다음에 ,을 가지고 있음을 이미 확인했다. 이것은 CONSTRAINT 라인 바로 위에 Tags이다. 왜 이런 일이 일어나는 지 아는 사람이 있습니까? 제약 조건을 선언하는 모든 온라인 예제에는 CREATE TABLE AS 문이 아닌 CREATE TABLE 문이 포함 된 것처럼 보입니다. 그게 중요합니까? 당신의 도움을 주셔서 감사합니다!구문 오류 또는 "CONSTRAINT"근처에있는 오류 PostgreSQL

그건 그렇고 제약 조건이 작동하지 않는지 묻는 이유는 CREATE TABLE AS 문이 아니라 CREATE TABLE 문을 사용하여 이미 작성한 테이블에서 아래의 제약 선을 복사/붙여 넣기했기 때문입니다. 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 TABLEALTER TABLE 문은 단일 트랜잭션에서 실행해야합니다.

@a_horse_with_no_name을 (를) 기고자로하여 this great Stack DBA article을 (를) 살펴 보시기 바랍니다.

+1

참조 용 : https://www.postgresql.org/docs/9.5/static/sql-createtableas.html. 'create table as select' 문법에는'constraint' 섹션이 없습니다. –

+0

@ RadekPostołowicz 죄송합니다, 어떤 이유로 든 완전히 놓쳤습니다. 나는 'CREATE TABLE AS'를 검색했고 어떤 이유로 'constraint' 섹션을 보여주는'CREATE TABLE' 문서만을 보았습니다. – christopheralan88

+1

@TimBiegeleisen 고마워, 나는 그 일을 할 수 있다고 생각했지만, CREATE TABLE AS 문에서 그것을 할 수있는 방법이 있기를 바랐다. 당신의 도움을 주셔서 감사합니다! – christopheralan88