SQLite | 데이터의 추가와 수정, 삭제 | 데이터 추가 (INSERT)


INSERT 문을 사용하여 테이블에 데이터를 추가하는 방법에 대해 설명한다. 모든 컬럼에 값을 지정하여 데이터를 추가하는 방법 외에 컬럼을 지정하여 데이터를 추가할 수도 있다.

모든 컬럼에 값을 지정하여 데이터 추가하기

테이블에 데이터를 추가하려면 INSERT 문을 사용한다. 몇가지 형식이 있는데, 테이블의 모든 컬럼에 값을 지정하여 데이터를 추가하는 경우의 형식은 다음과 같다.

INSERT INTO 테이블명 VALUES (1, 2, ...);

추가하려는 테이블에 포함된 컬럼 만큼의 값을 지정한다. 값은 작성된 순서대로 컬럼에 저장되기에, 값을 저장할 컬럼의 순서와 동일한 순서로 값을 지정해야 한다.

그러면 실제로 데이터를 추가해 보도록 하겠다. 먼저 다음과 같이 테이블을 만든다.

create table user (id integer, name text, old integer, address text);
sqlite> create table user (id integer, name text, old integer, address text);
sqlite> 

이 테이블에는 4개의 컬럼 id, name, old, address가 있다. 이 테이블에 데이터를 추가하려면 4개의 값을 컬럼의 순서에 따라 작성하여 추가한다. 예를 들어 “1, ‘devakuma’, 25, ‘Seoul’“와 같이 작성한다. 그럼 실제로 데이터를 추가해 보도록 한다.

insert into user values (1, 'devakuma', 25, 'Seoul');
sqlite> insert into user values (1, 'devakuma', 25, 'Seoul');
sqlite> 

위와 같이 에러가 표시되지 않으면 데이터의 추가는 성공이다. 동일하게 데이터를 추가한다.

insert into user values (3, 'kimkc', 32, 'Daejeon');
insert into user values (5, 'ariakuma', 27, 'Busan');
insert into user values (6, 'happykuma', 20, 'Gwangju');
sqlite> insert into user values (3, 'kimkc', 32, 'Daejeon');
sqlite> insert into user values (5, 'ariakuma', 27, 'Busan');
sqlite> insert into user values (6, 'happykuma', 20, 'Gwangju');
sqlite> 

이것으로 테이블에 4개의 데이터가 추가되었다. 그러면 SELECT 문을 사용하여 테이블에서 데이터를 조회해 보자.

select * from user;
sqlite> select * from user;
1|devakuma|25|Seoul
3|kimkc|32|Daejeon
5|ariakuma|27|Busan
6|happykuma|20|Gwangju
sqlite> 

4개의 데이터가 저장되어 있는데, 값을 입력한 순서대로 컬럼에 저장되어 있는 것을 확인할 수 있다.


이에 반해, 컬럼의 수와 추가 데이터의 수가 일치하지 않는 경우에는 에러가 발생한다. 방금 생성한 테이블은 4개의 컬럼이 있는데, 3개의 값만을 지정하여 데이터를 추가하면 “Error: table user has 4 columns but 3 values were supplied"와 같은 에러가 발생한다.

insert into user values (8, 'mykuma', 35);
sqlite> insert into user values (8, 'mykuma', 35);
Error: table user has 4 columns but 3 values were supplied
sqlite>

특정 컬럼에만 값을 지정하고, 다른 컬럼에는 기본값을 저장하려면 아래 설명하는 컬럼을 지정하는 방법을 참고하도록 한다.

특정 컬럼에만 값을 지정하여 데이터 추가하기

앞에서는 모든 컬럼에 값을 지정하는 방법을 데이터를 추가 하였지만, 특정 컬럼에만 값을 지정하고 데이터를 추가할 수도 있다. 이 경우에는 값이 지정되지 않은 컬럼은 기본 값이 저장된다.

컬럼을 지정하는 형식은 다음과 같다.

INSERT INTO 테이블  (컬럼1, 컬럼2, ...) VALUES (1, 2, ...);

값을 저장할 컬럼을 테이블명 뒤에 괄호로 둘려싸서 지정한다. 여러 컬럼이 있는 경우에는 쉼표(,)로 구분하여 작성한다. 그리고 지정된 컬럼의 수 만큼의 값을 지정한다.

데이터가 추가되었을 때, 지정된 컬럼에 값이 저장되지만, 지정되지 않은 컬럼에 DEFAULT 제약 조건이 설정되어 있으면 기본 값이 저장되고 DEFAULT 제약 조건이 설정되어 있지 않으면 NULL이 저장된다. (DEFAULT 제약 조건에 대해서는 “DEFAULT 제약 조건“을 참조한다.)

그러면 실제로 데이터를 추가해 보도록 하겠다. 먼저 다음과 같이 테이블을 만든다.

create table user (id integer, name text, address text default 'no value');
sqlite> create table user (id integer, name text, address text default 'no value');
sqlite>

테이블에는 3개의 컬럼이 있고 address 컬럼에 디폴트 제약이 설정되어 있다. 그러면 데이터를 추가해 보자. 우선 3개의 컬럼에 모두 값을 지정하여 데이터를 추가한다.

insert into user (id, name, address) values (1, 'devkuma', 'Seoul');
sqlite> insert into user (id, name, address) values (1, 'devkuma', 'Seoul');
sqlite> 

데이터 추가가 완료되었다. 모든 컬럼에 값을 지정하여 추가할 경우는 이 페이지의 앞부분에서 설명한 형식으로 다음과 같이 실행했을 경우와 동일하다.

insert into user values (1, 'devkuma', 'Seoul');

다음은 2개의 컬럼에만 값을 지정하여 데이터를 추가해 보자. 첫 번째는 id 컬럼와 name 컬럼만 두 번째는 id 컬럼과 address 컬럼에만 값을 지정하여 데이터를 추가한다.

insert into user (id, name) values (2, 'Busan');
insert into user (id, address) values (3, 'araikuma');
sqlite> insert into user (id, name) values (2, 'Busan');
sqlite> insert into user (id, address) values (3, 'araikuma');
sqlite> 

이것으로 테이블에는 지금 2건과 합해서 3건의 데이터가 추가되었다. 그러면 SELECT 문을 사용하여 테이블에서 데이터를 조회해 보자.

select * from user;
sqlite> .mode column
sqlite> .header on
sqlite> 
sqlite> select * from user;
id          name        address   
----------  ----------  ----------
1           devkuma     Seoul     
2           Busan       no value  
3                       araikuma  
sqlite> 

2번째 행의 데이터를 추가했을 때에는 address 컬럼의 값을 지정하지 않았지만, address 컬럼에 디폴트 제약이 설정되어 있었기 때문에 기본값인 ’no value’가 저장되어 있다. 3번째 행의 데이터를 추가했을 때에는 name 컬럼의 값을 지정하지 않았기 때문에 기본 값 NULL이 저장되어 있다. (NULL은 화면에 아무것도 표시되지 않는다.)

이렇게 테이블의 컬럼 중에 일부 컬럼 만에 값을 지정하여 데이터를 추가 할 수 있다.


또한 데이터를 추가할 때에 작성하는 컬럼의 순서는 테이블에서 정의된 컬럼의 순서대로 할 필요는 없다. 다음의 2건은 동일한 결과이며 에러도 발생하지 않는다.

insert into user (id, name) values (2, 'mykuma');
insert into user (name, id) values ('mykuma', 2);

  다만, 보기 힘들 수 있게 될수 있으므로 특별한 이유가 없다면 테이블에서 정의된 컬럼의 순서대로 작성하길 바란다.

값을 지정하지 않고 데이터 추가하기

값을 1개도 지정하지 않고 데이터를 추가할 수 있다. 이 경우 모든 컬럼에 디폴트 값이 저장된다.

값을 지정하지 않고 데이터를 추가하는 경우의 형식은 다음과 같다.

INSERT INTO 테이블명 DEFAULT VALUES;

그러면 실제로 해보도록 하겠다. 테이블은 이전 전과 동일한 것을 그대로 사용한다.

create table user (id integer, name text, address text default 'no value');

값을 지정하지 않고 아래와 같이 데이터를 추가한다.

insert into user default values;
sqlite> insert into user default values;
sqlite> 

그러면 추가된 데이터를 SELCT 문으로 확인해 본다.

select * from user;
sqlite> select * from user;
id          name        address   
----------  ----------  ----------
1           devkuma     Seoul     
2           Busan       no value  
3                       araikuma  
                        no value  
sqlite> 

추가된 데이터는 값이 지정되어 있지 않으므로 디폴트 제한이 설정되어 있지 않은 id 컬럼 name 컬럼에는 디폴트 값인 NULL이 저장되고, 디폴트 제약이 설정되어 있는 address 컬럼에 설정되어 있는 기본값이 저장이 되었다.

이와 같이 값을 1개나 지정하지 않고 데이터를 테이블에 추가 할 수 있다.

여러 데이터를 하나의 SQL문으로 한번에 추가하기

여러 데이터를 하나의 SQL문으로 한번에 추가할 수 있다. 여러 개의 SQL문을 실행하여 여러 건의 추가할 수도 있지만 한개의 SQL문만으로도 추가할 수도 있다.

여러 데이터를 하나의 SQL문으로 추가하는 경우의 형식은 다음과 같다.

INSERT INTO 테이블명 VALUES (1-1, 2-1, ...), (2-1, 2-2, ...), ...;
INSERT INTO 테이블명 (컬럼1, 컬럼2, ...) VALUES (1-1, 2-1, ...), (2-1, 2-2, ...), ...;

테이블 컬럼의 수 만큼의 값을 지정한 묶음을 쉼표(,)로 구분하여 여러 데이터를 작성한다. 그러고 값을 저장할 컬럼을 지정한 경우라면 지정된 만큼의 값을 지정한 묶음으로 지정한다.

그러면 실제로 데이터를 추가해 보도록 하겠다. 먼저 다음과 같이 테이블을 만든다.

create table user (id integer, name text, old integer);
sqlite> create table user (id integer, name text, old integer);
sqlite> 

이 테이블에는 3개의 컬럼 id, name, old가 있다. 이 테이블에 데이터를 추가하려면 3개의 값을 컬럼의 순서에 따라 작성한 묶음으로 작성한다. 예를 들어 “(1, ‘devakuma’, 25), (3, ‘kimkc’, 32), (5, ‘ariakuma’, 27)“와 같이 작성한다. 그럼 실제로 데이터를 추가해 보도록 한다.

insert into user values
(1, 'devakuma', 25), (3, 'kimkc', 32), (5, 'ariakuma', 27);
sqlite> insert into user values
   ...> (1, 'devakuma', 25), (3, 'kimkc', 32), (5, 'ariakuma', 27);
sqlite> 

이것으로 테이블에 3개의 데이터가 추가되었다. 그러면 SELECT 문을 사용하여 테이블에서 데이터를 조회해 보자.

select * from user;
sqlite> select * from user;
id          name        old       
----------  ----------  ----------
1           devakuma    25        
3           kimkc       32        
5           ariakuma    27        
sqlite> 

4개의 데이터가 저장되어 있는 것을 확인할 수 있다.

이 방법은 프로그램에서 여러 데이터를 매번 DB에 연결하여 INSERT문을 실행하여 발생하는 성능 부하 개선에 활용될 수도 있을거라 생각된다.