2011-10-05 3 views
0

남자를 얻을 수 없습니다. 한 테이블에서 결과를 가져 와서 다른 테이블에 삽입하기위한 쿼리가 있습니다. 다음과 같이 보입니다.나는이 겉으로보기에는 간단한 삽입 쿼리가 작동하도록

INSERT INTO minutes_deleted 
    SELECT * FROM minutes 
    WHERE minutes_id = 103 

이제는 시도해보고 삽입 할 수 있는지도 몰랐습니다. (나는 삽입 문 모든 구문, INSERT INTO blah VALUES (some values)을했다,하지만 난 알아 낸 설명서를 읽은 후 생각 할 수 있습니다

자, 문제는이 오류 준다이다 :. column "meeting_id" is of type integer but expression is of type character varying 내가 minutes_deleted의 열이기 때문에이 오류가 발생 생각을 에 따르면 minutes_id에있는 것보다 다른 순서로.

minutes_deletedminutes에없는 일부 열을 가지고 있지만 뒤죽박죽 된 순서 불구하고 minutes의 모든 열은 minutes_deleted에서 찾을 수 있습니다.

매뉴얼, 전체 테이블에 물건이 채워져있는 열 (예 : minutes_deleted에 값을 지정해야합니다. 따라서 열 순서를 지나칠 수 있으면 쿼리가 여전히 실패 할 수 있습니다.

그래서, 만약에 당신이 간단한 질문 : 그것이 작동되도록

1) I을 - 어떻게, 열의 순서를 재 배열에 대한 이동합니다.
2) minutes_deleted에있는 열의 빈 값을 minutes에 어떻게 지정합니까?

도움을 주셔서 감사합니다.

+0

** 각 테이블의 열을 나열하는 것이 더 빠르지 않습니까? **이 질문을 입력하는 것처럼 보입니다. 시간을 낭비하는 것입니다. 항상'insert' 컬럼을 입력하고'select *'컬럼을 입력하지 않는 것이 가장 좋습니다. –

답변

7

목적지와 소스 테이블의 컬럼 데이터 유형이 같은 순서가 아닐 수 있습니다.

이 문제를 해결하려면 대상 및 소스에 대한 열 순서를 명시해야합니다.

INSERT INTO MyDestination (Column1, Column2, Column3) 
     SELECT ColumnA, 
      ColumnB, 
      ColumnC 
     FROM MySource; 
  • COLUMNA는
  • ColumnC는

을 이용하여야 캐스팅/변환 당신이 필요로 COLUMN3과 동일한 유형이어야합니다

  • COLUMNB가 열 2와 동일한 유형이어야합니다 열 1과 동일한 유형이어야합니다 목적지에 맞춰라.

  • +0

    그건 좋은 생각 인 것 같지만, 음, 그 구문은 무엇입니까? 그냥'SELECT column1, column3, column2 ... FROM..' – zermy

    +1

    +1 명시 적으로 열을 지정하지 않고 삽입하는 것은 좋지 않습니다. – HLGEM

    +0

    데이터 유형이 다르면 명령문의 selct 부분에서 올바른 데이터 유형으로 변환해야 할 수도 있습니다. 데이터가 전송되지 않으면 소스 테이블의 데이터가 대상 테이블의 데이터 유형과 작동하지 않고 데이터의 불량 부분을 찾아서 수정해야하는 데이터 문제가 발생합니다. – HLGEM

    1

    해당 구문을 사용하려면 minutes 및 minutes_deleted 같은 유형의 열이 동일한 순서로 있어야합니다. 열을 나열하여 더 명확하게하는 것이 좋습니다. 보고있는 오류를 막지는 못하지만 오류가 더 분명해질 것입니다. 내가 삽입 이런 종류의 작업을 수행 할 때마다

    INSERT INTO minutes_deleted 
        (Col1, Col2, ..., ColN) 
        SELECT AnotherCol1, AnotherCol2, ..., AnotherColN 
         FROM minutes 
         WHERE minutes_id = 103 
    
    3

    , 나는 일반적으로 그들은 완벽한 일치가 아니라면 특별히 열을 나열 할 수 있습니다

    INSERT INTO minutes_deleted (somecol1, somecol2, somecol3) 
        SELECT somecol1, somecol2, somecol3 
        FROM minutes 
        WHERE minutes_id = 103 
    
    1
    INSERT INTO minutes_deleted(value1) 
    SELECT theValueToInsert FROM minutes 
    WHERE minutes_id = 103 
    

    는 사용하지 마십시오 *.

    1

    조 이노스으로,하지만 두 번째 테이블에없는 데이터에 약간의 열을 설정하는 능력 :

    INSERT INTO minutes_deleted (somecol1, somecol2, somecol3) 
    SELECT somecol1, somecol2, "static text" as somecol3 
    FROM minutes 
    WHERE minutes_id = 103 
    
    1

    당신은이 질문에 대답하기 위해) 명시 적 NULL에 열을 설정할 수 있습니다

    INSERT INTO minutes_deleted (col_1, col_2,col_3, col_5) -- note the missing col4 
    SELECT col_a, col_b, col_c, col_e -- note the missing col_d 
        FROM minutes 
    WHERE minutes_id = 103; 
    

    , 더 간단한 방법이 있습니다. INSERT :
    위의 그림과 같이 INSERT 문에서 필드를 생략하면 기본값 인 0123으로 설정됩니다.을 지정하십시오.

    정확하게 말하면 해당 열이 문자열 형식 (예 : text) 인 경우 "빈 값"에 가장 가까운 것은 NULL이 아닌 빈 문자열입니다. 이를 위해 ''을 삽입하면 두 개의 작은 따옴표 사이에 아무 것도 쓰이지 않습니다.

    관련 문제