Insert (SQL)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
INSERT는 SQL에서 테이블에 새로운 행을 추가하는 데 사용되는 명령어이다. 기본적으로 `INSERT INTO` 구문을 사용하여 특정 열에 값을 지정하거나, 열 목록을 생략하고 테이블 생성 시 정의된 순서대로 값을 삽입할 수 있다. 또한, 한 번에 여러 행을 삽입하는 다중 행 삽입, 다른 테이블의 데이터를 복사하여 삽입하는 기능, 그리고 기본값 설정을 지원한다. 데이터베이스 시스템은 INSERT 작업 후 생성된 키 값을 검색하는 다양한 방법을 제공하며, INSERT 문에 정의된 트리거를 통해 데이터 삽입 전후에 추가적인 작업을 수행할 수 있다.
더 읽어볼만한 페이지
- SQL 키워드 - TRUNCATE (SQL)
TRUNCATE는 SQL에서 테이블 내의 모든 데이터를 빠르게 삭제하는 명령어로, 외래 키 제약 조건 무시, 테이블 잠금 방식, 트랜잭션 처리 방식 등 DELETE 명령어와 차이를 보이며, WHERE 절을 사용할 수 없어 테이블의 모든 행을 삭제하고, 일부 데이터베이스 시스템에서는 롤백이 불가능할 수 있다. - SQL 키워드 - Null (SQL)
Null은 SQL에서 데이터베이스 테이블 열의 값 부재를 나타내는 특별한 표식으로, 0이나 빈 문자열과 구별되며 삼진 논리와 관련된 특별한 처리 방식으로 인해 데이터베이스 설계 및 쿼리 작성 시 주의가 필요하고 SQL 표준 구현에 대한 논쟁이 존재한다.
Insert (SQL) | |
---|---|
일반 정보 | |
이름 | INSERT |
종류 | SQL 구문 |
용도 | 테이블에 새 데이터 삽입 |
구문 | |
기본 구문 | INSERT INTO 테이블_이름 (열1, 열2, 열3, ...) VALUES (값1, 값2, 값3, ...); |
모든 열에 삽입 시 | INSERT INTO 테이블_이름 VALUES (값1, 값2, 값3, ...); |
여러 행 삽입 (Transact-SQL) | INSERT INTO 테이블_이름 (열1, 열2) SELECT 값1, 값2 UNION ALL SELECT 값3, 값4; |
매개변수 | |
테이블_이름 | 데이터를 삽입할 테이블의 이름 |
열1, 열2, 열3, ... | 데이터를 삽입할 열의 이름 (생략 가능) |
값1, 값2, 값3, ... | 삽입할 데이터 값 |
예제 | |
고객 테이블에 새 고객 정보 삽입 | INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country) VALUES ('Alfreds Futterkiste', 'Maria Anders', 'Obere Str. 57', 'Berlin', '12209', 'Germany'); |
제품 테이블에 모든 열에 값 삽입 | INSERT INTO Products VALUES ('Chocolade', 10, 25); |
주의 사항 | |
데이터 형식 | 삽입하는 값은 해당 열의 데이터 형식과 일치해야 함 |
제약 조건 | 테이블에 설정된 제약 조건(예: NOT NULL, UNIQUE)을 위반하지 않아야 함 |
자동 증가 열 | 자동 증가 열(예: IDENTITY)은 값을 명시적으로 지정하지 않아도 자동으로 생성됨 |
활용 | |
대량 데이터 삽입 | 대량의 데이터를 삽입할 때는 성능 향상을 위해 BULK INSERT 문 또는 테이블 값 생성자 (Transact-SQL)를 사용하는 것이 좋음 |
임시 테이블 | 임시 테이블에 데이터를 삽입하여 복잡한 쿼리를 단순화할 수 있음 |
관련 SQL 구문 | |
SELECT | 테이블에서 데이터를 검색 |
UPDATE | 테이블의 기존 데이터를 수정 |
DELETE | 테이블에서 데이터를 삭제 |
2. 기본 형식
SQL에서 `INSERT` 문은 테이블에 새로운 행 (데이터 레코드)을 추가하는 데 사용된다. 데이터를 삽입하는 기본적인 방법은 두 가지 형식이 있다.
첫 번째 형식은 삽입할 열과 해당 값을 명시적으로 지정하는 방식이다.
INSERT INTO 테이블명 (열1, 열2, 열3, ...)
VALUES (값1, 값2, 값3, ...);
이 형식에서는 `VALUES` 절에 지정된 값의 순서와 개수가 괄호 안에 명시된 열의 순서 및 개수와 일치해야 한다.
두 번째 형식은 테이블에 정의된 열 순서대로 모든 열에 값을 삽입할 때 열 목록을 생략하는 방식이다.
INSERT INTO 테이블명
VALUES (값1, 값2, 값3, ...);
이 경우 `VALUES` 절에 제공되는 값의 순서와 개수는 테이블 생성 시 정의된 열의 순서 및 개수와 정확히 일치해야 한다.
어떤 형식을 사용하든, 삽입되는 값은 해당 열이나 테이블에 적용된 모든 제약 조건(예: 기본 키, CHECK 제약 조건, NOT NULL 제약 조건 등)을 만족해야 한다. 만약 구문 오류가 있거나 값이 제약 조건을 위반하면, 새로운 행은 테이블에 추가되지 않고 오류가 반환된다. 열 목록에서 특정 열을 생략하면, 해당 열에는 미리 정의된 기본값(Default)이 입력되거나, 기본값이 없을 경우 NULL 값이 허용된다면 NULL이 입력된다.
2. 1. 단일 행 삽입
테이블에 한 번에 하나의 행을 추가하는 가장 기본적인 방법이다. 기본 형식은 다음과 같다.```sql
INSERT INTO 테이블명 (컬럼1, 컬럼2, 컬럼3, ...)
VALUES (값1, 값2, 값3, ...);
```
`INSERT INTO` 다음에는 데이터를 삽입할 테이블 이름을 지정하고, 괄호 안에는 값을 넣을 컬럼 이름을 나열한다. `VALUES` 다음의 괄호 안에는 각 컬럼에 해당하는 값을 순서대로 넣는다. 이때, 지정된 컬럼의 수와 값의 수는 정확히 일치해야 한다.
만약 테이블의 모든 컬럼에 순서대로 값을 넣는다면 컬럼 목록을 생략할 수 있다. 이 경우, 테이블이 생성될 때 정의된 컬럼 순서를 따라야 한다.
```sql
INSERT INTO 테이블명
VALUES (값1, 값2, 값3, ...);
```
값을 명시적으로 지정하지 않은 컬럼에는 해당 컬럼에 미리 정의된 기본값(Default)이 사용되거나, 기본값이 없다면 NULL 값이 들어간다.
삽입하려는 값은 해당 컬럼이나 테이블에 적용된 모든 제약 조건을 만족해야 한다. 예를 들어 기본 키 제약, 고유성 제약, 참조 무결성 제약, CHECK 제약, NOT NULL 제약 등이 있다. 만약 SQL 문법에 오류가 있거나 값이 제약 조건을 위반하면, 새로운 행은 테이블에 추가되지 않고 데이터베이스 시스템은 오류를 반환한다.
'''예시'''
`phone_book` 테이블의 `name` 컬럼에는 'John Doe'를, `number` 컬럼에는 '555-1212'를 삽입하는 예시는 다음과 같다.
INSERT INTO phone_book (name, number) VALUES ('John Doe', '555-1212');
컬럼 목록을 생략하고 `phone_book` 테이블의 첫 번째와 두 번째 컬럼에 값을 삽입하는 예시는 다음과 같다. (테이블 생성 시 `name`과 `number`가 첫 두 컬럼이라고 가정)
INSERT INTO phone_book VALUES ('John Doe', '555-1212');
2. 2. 컬럼 생략
테이블 생성 시 정의된 컬럼 순서대로 모든 컬럼에 값을 삽입할 경우에는 컬럼 목록 지정을 생략할 수 있다. 이때 사용하는 형식은 다음과 같다.'''INSERT INTO''' 테이블명 '''VALUES''' (값1, 값2, ...)
컬럼 지정을 생략하면 테이블 생성 시 정의된 컬럼 순서대로 모든 컬럼에 값을 지정하는 것으로 간주된다. 따라서 `VALUES` 절에 지정하는 값의 개수와 순서는 테이블 정의 시의 컬럼 개수 및 순서와 정확히 일치해야 한다.
아래는 컬럼 목록을 생략하고 데이터를 삽입하는 예시이다. `phone_book` 테이블에 `name`과 `number` 컬럼이 순서대로 정의되어 있다고 가정한다.
INSERT INTO phone_book VALUES ('Jane Doe', '555-5678');
3. 고급 형식
SQL의 `INSERT` 문은 단순히 한 행의 데이터를 테이블에 추가하는 기본 기능 외에도, 데이터 관리를 효율적으로 수행할 수 있는 여러 고급 활용법을 제공한다. 이러한 고급 형식들은 복잡한 데이터 입력 작업을 단순화하고 데이터베이스 성능을 개선하는 데 도움을 줄 수 있다.
주요 고급 기능으로는 여러 개의 데이터 행을 하나의 `INSERT` 문으로 동시에 처리하는 다중 행 삽입 방식과, 기존 테이블에서 조회한 결과를 바로 다른 테이블에 삽입하는 데이터 복사 기능 등이 있다. 각 기능의 구체적인 사용법과 지원 여부는 사용하는 DBMS에 따라 다를 수 있다.
3. 1. 다중 행 삽입 (Multirow Inserts)
SQL-92 표준부터 지원되는 기능으로, 하나의 SQL 문으로 여러 행을 동시에 삽입할 수 있다. 이를 위해 '행 값 생성자'(row value constructor)를 사용한다.기본적인 구문은 다음과 같다.
INSERT INTO 테이블명 (컬럼명1, [컬럼명2, ...])
VALUES (값1a, [값1b, ...]),
(값2a, [값2b, ...]),
...;
이 구문은 열의 개수와 값의 개수가 일치해야 한다. 만약 특정 열을 지정하지 않으면 해당 열에는 테이블 생성 시 정의된 기본값(DEFAULT) 또는 NULL 값이 사용된다. 열의 순서는 임의로 지정할 수 있으며, 열 지정을 생략하면 테이블 생성 시의 열 순서대로 모든 열을 지정한 것으로 간주한다. 삽입되는 값들은 해당 열 또는 테이블에 적용된 제약 조건(기본 키 제약, 고유성 제약, 참조 무결성 제약, CHECK 제약, NOT NULL 제약 등)을 만족해야 한다. 문법 오류나 제약 조건 위반 시 행 추가는 실패한다.
'''예시'''
`phone_book` 테이블에 `name`과 `number` 열만 있다고 가정할 때, 다음과 같이 여러 행을 한 번에 삽입할 수 있다.
INSERT INTO phone_book (name, number) VALUES ('John Doe', '555-1212'), ('Peter Doe', '555-2323');
다른 예시는 다음과 같다.
INSERT INTO phone_book (name, sex) VALUES ('Nancy', 'Woman'), ('Tom', 'Man'), ('Cathy', 'Woman');
이 방식은 여러 개의 개별 `INSERT` 문을 실행하는 것과 결과는 동일하지만, 데이터베이스 시스템에 따라 처리 효율이 더 높을 수 있다.
INSERT INTO phone_book VALUES ('John Doe', '555-1212');
INSERT INTO phone_book VALUES ('Peter Doe', '555-2323');
다만, 위와 같이 두 개의 개별 문으로 나누어 실행하면 트리거 동작 등에서 단일 다중 행 삽입과 다른 의미를 가질 수 있으며, 성능 면에서도 차이가 발생할 수 있다.
이 표준 다중 행 삽입 기능은 다음 데이터베이스 시스템들에서 지원된다.
- IBM Db2
- SQL Server (버전 10.0, 즉 SQL Server 2008부터)
- PostgreSQL (버전 8.2부터)
- MySQL
- SQLite (버전 3.7.11부터)
- H2
일부 데이터베이스 시스템에서는 비표준적인 방식으로 다중 행 삽입을 지원하기도 한다.
- MS SQL Server: `UNION ALL`을 사용하는 방식이 있지만, 이는 SQL:2003 표준에 부합하지 않는다.
INSERT INTO phone_book
SELECT 'John Doe', '555-1212'
UNION ALL
SELECT 'Peter Doe', '555-2323';
- Oracle: DUAL 테이블과 `UNION ALL`을 사용하거나, `LATERAL` 절을 이용하는 방식이 있다. 이 역시 표준 SQL 구문은 아니다.
- - DUAL 테이블 사용
INSERT INTO phone_book
SELECT 'John Doe', '555-1212' FROM DUAL
UNION ALL
SELECT 'Peter Doe','555-2323' FROM DUAL;
- - LATERAL 절 사용 (표준 준수 구현 예시)
INSERT INTO phone_book
SELECT 'John Doe', '555-1212' FROM LATERAL ( VALUES (1) ) AS t(c)
UNION ALL
SELECT 'Peter Doe','555-2323' FROM LATERAL ( VALUES (1) ) AS t(c);
또한, PL/SQL에서는 여러 삽입 문이
SELECT
로 종료되는 INSERT ALL
문을 지원한다:[1]INSERT ALL
INTO phone_book VALUES ('John Doe', '555-1212')
INTO phone_book VALUES ('Peter Doe', '555-2323')
SELECT * FROM DUAL;
- Firebird: 시스템 테이블 `RDB$DATABASE`와 `UNION ALL`을 사용하는 방식이 있다. 단, 이 방식은 한 번에 삽입할 수 있는 행의 수에 제한이 있을 수 있다.
INSERT INTO phone_book (name, number)
SELECT 'John Doe', '555-1212' FROM RDB$DATABASE
UNION ALL
SELECT 'Peter Doe', '555-2323' FROM RDB$DATABASE;
3. 2. 다른 테이블에서 데이터 복사 (Copying rows from other tables)
`INSERT` 문은 다른 테이블에서 데이터를 검색하고, 필요한 경우 수정하여 해당 데이터를 테이블에 직접 삽입하는 데에도 사용할 수 있다. 이 모든 작업은 클라이언트 애플리케이션에서 중간 처리를 거치지 않고 단일 SQL 문으로 수행된다. `VALUES` 절 대신 하위 선택 쿼리(`SELECT` 문)를 사용한다.하위 선택 쿼리에는 조인, 함수 호출 등을 포함할 수 있으며, 데이터를 삽입할 테이블과 동일한 테이블을 쿼리할 수도 있다. 논리적으로 볼 때, 실제 삽입 작업이 시작되기 전에 `SELECT` 쿼리가 먼저 평가된다.
기본적인 사용 형식은 다음과 같다.
INSERT INTO 테이블명1
SELECT *
FROM 테이블명2
WHERE 조건식;
이 구문은 테이블2에 대한 `SELECT` 문의 쿼리 결과를 테이블1에 추가한다.
'''예시'''
`phone_book` 테이블에서 이름이 'John Doe' 또는 'Peter Doe'인 사람들의 모든 정보를 `phone_book2` 테이블로 복사한다.
INSERT INTO phone_book2
SELECT *
FROM phone_book
WHERE name IN ('John Doe', 'Peter Doe');
만약 원본 테이블의 데이터 중 일부 열만 새 테이블에 삽입하거나, 두 테이블의 스키마가 다른 경우에는 삽입할 열을 명시적으로 지정해야 한다.
INSERT INTO phone_book2 (name, number)
SELECT name, number
FROM phone_book
WHERE name IN ('John Doe', 'Peter Doe');
이때 `SELECT` 문으로 조회되는 결과의 스키마는 데이터가 삽입될 테이블(여기서는 `phone_book2`)의 스키마와 일치해야 한다. 즉, 열의 개수와 각 열의 데이터 타입이 맞아야 한다.
4. 기본값 (Default Values)
새로운 행을 삽입할 때, 값을 명시적으로 지정하지 않은 열에는 테이블 생성 시 정의된 기본값이 사용된다. 모든 열에 기본값을 사용하고 싶을 경우, 특정 구문을 사용할 수 있다.
하지만 데이터베이스 시스템마다 동작 방식이 다르다. 예를 들어, Microsoft SQL Server와 같은 일부 데이터베이스는 아무런 데이터도 제공하지 않으면 INSERT
문 실행을 거부한다. 이런 경우에는 DEFAULT
키워드를 사용하여 기본값을 명시적으로 지정해야 한다.
INSERT INTO phone_book
VALUES ( DEFAULT ) /* 모든 열에 기본값을 사용하여 행 삽입 (일부 DB 시스템에서만 가능) */
데이터베이스에 따라 DEFAULT
키워드를 사용하는 다른 구문을 지원하기도 한다. 예를 들어, MySQL에서는 DEFAULT
키워드를 생략하고 빈 괄호 ()
를 사용할 수 있으며, T-SQL에서는 VALUES (DEFAULT)
대신 DEFAULT VALUES
구문을 사용할 수 있다.
INSERT INTO phone_book DEFAULT VALUES; /* T-SQL 방식 */DEFAULT
키워드는 특정 열에만 기본값을 사용하고 싶을 때도 유용하다. VALUES
절에서 기본값을 사용하려는 열의 위치에 DEFAULT
를 명시하면 된다.
INSERT INTO phone_book (name, number)
VALUES ( DEFAULT, '555-1212' ); /* 'name' 열에는 기본값을, 'number' 열에는 '555-1212'를 삽입 */
만약 어떤 열에 기본값이 정의되어 있지 않은 상태에서 값을 지정하지 않거나 DEFAULT
키워드를 사용하면, 데이터베이스 시스템에 따라 동작이 달라진다. 예를 들어, MySQL이나 SQLite는 (엄격 모드가 아닐 경우) 해당 열을 빈 값이나 NULL로 채우는 반면, 다른 많은 데이터베이스 시스템은 오류를 발생시키며 INSERT
문 실행을 거부한다.
값을 명시적으로 지정하지 않은 열에는 기본값 또는 NULL이 사용된다. 이렇게 설정된 값(명시적 값, 기본값, NULL)은 해당 열이나 테이블에 적용된 모든 제약 조건(기본 키 제약, 고유성 제약, 참조 무결성 제약, CHECK 제약, NOT NULL 제약 등)을 만족해야 한다. 만약 문법 오류가 있거나 제약 조건을 위반하면 행 삽입은 실패한다.
5. 생성된 키 값 확인 (Retrieving the key)
데이터베이스 설계 시 테이블의 기본 키로 대리 키(surrogate key)를 사용하는 경우가 많다. 특히 이 키 값이 자동으로 증가하는 방식으로 설정된 경우, SQL INSERT 문을 실행하여 새로운 행을 추가한 뒤 데이터베이스가 자동으로 생성한 기본 키 값을 알아내야 할 때가 있다. 이 값은 다른 SQL 문에서 해당 행을 참조하기 위해 필요하기 때문이다.
대부분의 데이터베이스 시스템은 INSERT 문 자체에서 삽입된 행의 데이터를 직접 반환하는 것을 허용하지 않으므로, 생성된 키 값을 얻기 위해서는 별도의 방법이 필요하다. 데이터베이스 시스템마다 사용하는 방법이 다르며, 일반적인 구현 방식은 다음과 같다.
- 데이터베이스별 저장 프로시저 사용: 대리 키를 생성하고, INSERT 작업을 수행한 후, 마지막으로 생성된 키 값을 반환하는 저장 프로시저를 이용한다. 예를 들어, Microsoft SQL Server에서는 SCOPE_IDENTITY()라는 특수 함수를 사용해 키를 검색할 수 있고, SQLite에서는 last_insert_rowid() 함수를 사용한다.
- 임시 테이블 활용: 마지막으로 삽입된 행의 정보를 담는 임시 테이블에 대해 SELECT 문을 사용하는 방법도 있다. Db2는 다음과 같은 방식으로 이 기능을 지원한다.
SELECT *
FROM NEW TABLE (
INSERT INTO phone_book
VALUES ( 'Peter Doe','555-2323' )
) AS t
Db2 for z/OS의 경우 다음과 같이 사용한다.
SELECT EMPNO, HIRETYPE, HIREDATE
FROM FINAL TABLE (
INSERT INTO EMPSAMP (NAME, SALARY, DEPTNO, LEVEL)
VALUES('Mary Smith', 35000.00, 11, 'Associate')
);
- 데이터베이스별 함수 사용: INSERT 문을 실행한 직후, 가장 최근에 삽입된 행에 대해 생성된 기본 키 값을 반환하는 데이터베이스별 함수를 SELECT 문과 함께 사용한다. 예를 들어, MySQL에서는 LAST_INSERT_ID() 함수를 사용한다.
- 고유 조합 활용: 원래 INSERT 문에 사용된 데이터 중 고유한 조합을 찾아, 이후 SELECT 문에서 해당 조합을 조건으로 사용하여 삽입된 행을 찾는 방법이다.
- GUID 사용: INSERT 문에서 전역 고유 식별자(GUID)를 키 값으로 직접 사용하고, 이후 SELECT 문에서 이 GUID를 이용해 행을 검색한다.
- OUTPUT 절 사용 (MS-SQL Server): MS-SQL Server 2005 및 MS-SQL Server 2008에서는 INSERT 문 내에서 OUTPUT 절을 사용하여 삽입된 행의 정보(생성된 키 포함)를 반환받을 수 있다.
- RETURNING 절 사용 (Oracle, PostgreSQL, Firebird):
- Oracle에서는 INSERT 문에 RETURNING 절을 추가하여 생성된 키 값을 변수에 저장할 수 있다.
INSERT INTO phone_book VALUES ( 'Peter Doe','555-2323' )
RETURNING phone_book_id INTO v_pb_id
- PostgreSQL (8.2 버전 이후) 역시 RETURNING 절을 지원하며, 삽입된 행의 지정된 컬럼 값을 반환한다.
INSERT INTO phone_book VALUES ( 'Peter Doe','555-2323' )
RETURNING phone_book_id
- Firebird도 데이터 수정 언어(DSQL) 문에서 PostgreSQL과 동일한 RETURNING 구문을 사용한다 (단, 이 구문은 최대 한 행만 추가할 수 있다).[2] 저장 프로시저, 트리거 등 PSQL 환경에서는 Oracle과 유사한 RETURNING ... INTO ... 구문을 사용한다.[3]
- IDENTITY() 함수 사용 (H2): H2 데이터베이스에서는 IDENTITY() 함수를 호출하여 마지막으로 삽입된 행의 식별자(키 값)를 얻을 수 있다.
SELECT IDENTITY();
6. 트리거 (Triggers)
만약 ''INSERT'' 문이 작동하는 테이블에 트리거가 정의되어 있다면, 해당 트리거는 연산의 맥락에서 평가된다. ''BEFORE INSERT'' 트리거는 테이블에 삽입될 값의 수정을 허용한다. ''AFTER INSERT'' 트리거는 더 이상 데이터를 수정할 수 없지만, 예를 들어 감시 메커니즘을 구현하기 위해 다른 테이블에 대한 작업을 시작하는 데 사용될 수 있다.
참조
[1]
웹사이트
Oracle PL/SQL: INSERT ALL
http://psoug.org/sni[...]
2010-09-02
[2]
웹사이트
Firebird 2.5 Language Reference Update
http://www.firebirds[...]
2011-10-24
[3]
웹사이트
Firebird SQL Language Dictionary
http://firebirdsql.s[...]
[4]
웹인용
INSERT(Transact-SQL)
http://msdn.microsof[...]
http://msdn.microsoft.com
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com