[sql] PostgreSQL : 다른 테이블에서 삽입

다른 테이블의 테이블에 데이터를 삽입하려고하는데 테이블에는 공통 열이 하나만 있습니다. 문제는 TABLE1에 null 값을 허용하지 않는 열이 있으므로 비워 둘 수 없으며 TABLE2에서 가져올 수 없다는 것입니다.

나는 TABLE1이 있습니다 : id, col_1 (null 아님), col_2 (null 아님), col_3 (널 아님)

및 TABLE2 : id, col_a, col_b, col_c

그래서 어떻게 TABLE2의 id를 TABLE1에 삽입하고 “data1”, “data2”, “data3″과 같은 하드 코딩 된 문자열로 col_1-3을 채울 수 있습니까?

INSERT INTO TABLE1 (id) SELECT id FROM TABLE2 WHERE col_a = "something";

결과 :

오류 : “col_1″열의 null 값이 null이 아닌 제약 조건을 위반합니다.



답변

SELECT에 리터럴 값을 제공하십시오.

INSERT INTO TABLE1 (id, col_1, col_2, col_3)
SELECT id, 'data1', 'data2', 'data3'
FROM TABLE2
WHERE col_a = 'something';

선택 목록에는 모든 값 표현식이 포함될 수 있습니다 .

그러나 선택 목록의 식은 FROM 절의 테이블 식에있는 열을 참조 할 필요가 없습니다. 예를 들어 상수 산술식이 될 수 있습니다.

그리고 문자열 리터럴은 확실히 값 표현식입니다.


답변

병합을 사용할 수 있습니다.

insert into destination select coalesce(field1,'somedata'),... from source;


답변

매우 늦은 답변이지만 사용자가 테이블 A의 데이터를 테이블 B에 삽입 (복사)하려는 특정 사용 사례에 대해서는 내 대답이 더 간단하다고 생각합니다.

INSERT INTO table_b (col1, col2, col3, col4, col5, col6)
SELECT col1, 'str_val', int_val, col4, col5, col6
FROM table_a


답변

참조 무결성 :

insert into  main_tbl (col1, ref1, ref2, createdby)
values ('col1_val',
        (select ref1 from ref1_tbl where lookup_val = 'lookup1'),
        (select ref2 from ref2_tbl where lookup_val = 'lookup2'),
        'init-load'
       );


답변