INSERT INTO 구문은 일반적으로 VALUES 로 그 값을 지정해서 사용합니다.
하지만, 작업을 하다보면, 테이블 간의 자료이동, 복사 등 INSERT 구문으로 처리해야함에도 불구하고, VALUES 값을 일일히 지정해 가면서 하기에는 너무 많은 잔손질이 필요한 작업들이 종종생깁니다.
이럴때, INSERT INTO ... SELECT 구문은 그 유용성을 한껏 발휘합니다.
기존 테이블의 자료를 새로운 테이블에 일괄적으로 넣는 방법에는 3가지 정도가 있습니다.
SELECT ... INTO 구문
CREATE TABLE ... AS
INSERT INTO ... SELECT 구문
윗 두 구문은 존재하지 않는 테이블을 만드는 것이고,
INSERT INTO ... SELECT 구문은 반드시 INTO 할 테이블이 존재하는 것이 차이겠지요.
하지만, 이것은 단지 일차적인 차이일 뿐이고, 내부적으로는 OID 문제에 있어서 엄청난 차이를 보입니다.
왜 간편한 SELECT ... INTO 구문이나, CREATE TABLE ... AS 구문을 이야기하지 않고, INSERT INTO ... SELECT 구문을 이야기하는가 하면, 바로 이 내부적인 엄청난 차이에서 얻는 잇점을 설명하기 위해서입니다.
INSERT INTO ... SELECT 는 말 그대로 SELECT한 결과 지정한 테이블의 데이터로 집어넣겠다는 것입니다.
여기서 전재되는 것은 그 '지정한 테이블'은 그 테이블 스키마에 독립적이고, 갖갖가지 제약조건, 외래키 등을 모두 가질 수 있을 것이며, 또한 해당 튜플에 대한 OID를 가지지 않을 수도 있을 것입니다.
이런 RDBM 적인 성격을 그대로 가지고 있으면서, 이 테이블에 다른 테이블에서 참조한 원하는 값을 집어 넣겠다는 것이지요.
SELECT ... INTO 나, CREATE TABLE ... AS 구문에서는 위에서 말한 그런 모든 것을 무시하고 - 어떠한 RDBM 적인 성격들을 완전히 무시하고, 단지 SELECT 한 결과를 튜플들의 자료형에 따라 가장 초보적인 테이블을 만들어냅니다.
물론 SELECT INTO나, CREATE TABLE AS 로 만드는 것이 더유용할 때로 있습니다. - 경험상 대부분 임시적이거나 통계적인 테이블들이 이런식으로 만들면 편하더군요.
하지만, 마스터성의 해당 데이터베이스의 주요 테이블들을 이런식으로 만들고 사용하게 된다면, 나중에 고생하게 됩니다.
즉, 그 주요 테이블들의 복사나 스키마 수정에 따른 대량 자료 이동이 있을 경우에는 반드시 INSERT INTO ... SELECT 구문을 숙지하셔서 이용하시면 도움이 많이 될겝니다.
초보적인 이야기지만,
이 구문을 사용할때, 꼭 주의 하셔야할 것이 데이터가 들어가는 테이블의 자료구조와 SELECT 되는 그 결과 자료구조가 완벽하게 동일해야된 다는 것을 명심해야겠지요.
|