logo

[SQLite] INSERT

SQLite에서 INSERT 문은 데이터를 테이블에 삽입하는 데 사용됩니다. 다양한 형태의 INSERT 문을 사용하여 데이터를 입력할 수 있으며, 각각의 사용법에 따라 다른 상황에 적합합니다.

 

INSERT INTO ... VALUES

가장 기본적인 형태로, 직접적으로 한 행 또는 여러 행의 데이터를 테이블에 삽입할 때 사용됩니다.

INSERT INTO Employees (Name, Age, Department)
VALUES ('John Doe', 30, 'Marketing');

이 예시는 Employees 테이블에 새 직원 'John Doe'의 정보를 삽입합니다. 여기서 Name, Age, Department는 삽입할 열을 지정하고, VALUES 다음에 나오는 괄호 안에는 각 열에 해당하는 값들을 나열합니다.

여러 행을 한 번에 삽입하려면, 각 행에 대한 값을 쉼표로 구분하여 나열합니다:

INSERT INTO Employees (Name, Age, Department)
VALUES ('Jane Doe', 28, 'HR'), ('Jim Beam', 32, 'IT');
 

INSERT INTO ... SELECT

이 형태는 다른 테이블에서 선택한 데이터를 현재 테이블에 삽입하는 데 사용됩니다. 복잡한 쿼리 결과나 다른 테이블의 데이터를 현재 테이블에 삽입할 때 유용합니다.

INSERT INTO MarketingEmployees (Name, Age, Department)
SELECT Name, Age, Department FROM Employees WHERE Department = 'Marketing';

이 예시는 Employees 테이블에서 마케팅 부서에 속한 직원들의 정보를 선택하여 MarketingEmployees 테이블에 삽입합니다.

 

INSERT INTO ... DEFAULT VALUES

이 명령은 테이블의 모든 열에 대해 기본값을 사용하여 새 행을 삽입합니다. 테이블에 기본값이 정의되어 있는 열에 대해서만 데이터가 삽입되고, 나머지 열은 NULL이나 열 타입의 기본값을 가집니다.

INSERT INTO Employees DEFAULT VALUES;

이 명령은 Employees 테이블에 새 행을 추가하되, 모든 열에 대해 정의된 기본값을 사용하여 삽입합니다. 기본값이 명시적으로 정의되지 않은 열은 타입에 따른 기본값(예: NULL)을 가집니다.

 

UPSERT

SQLite에서 INSERT 명령이 특정 제약 조건(주로 유니크 제약 조건)을 위반할 때, 대신 수행할 업데이트 작업을 지정하는 UPSERT 기능이 있습니다. 이는 INSERT ON CONFLICT 구문을 사용하여 구현됩니다. UPSERT는 데이터가 이미 존재하는 경우 업데이트하고, 그렇지 않은 경우 새로운 데이터를 삽입하는 로직을 간결하게 작성할 수 있게 해줍니다.

UPSERT의 작동 방식:

  • INSERT 명령이 실행되어 행을 삽입하려고 시도합니다.
  • 삽입하려는 행이 테이블의 유니크 제약 조건이나 프라이머리 키 제약 조건을 위반하는 경우, ON CONFLICT 절이 트리거됩니다.
  • DO NOTHING을 사용하면 충돌이 발생해도 아무런 조치를 취하지 않고, DO UPDATE를 사용하면 지정된 열을 업데이트합니다.

Employees 테이블이 있고, 이 테이블에는 EmployeeID가 유니크 키로 설정되어 있다고 가정해 봅시다. 직원 정보를 삽입하려고 할 때, EmployeeID가 이미 존재하는 경우 해당 직원의 NameDepartment 정보를 업데이트하고 싶다고 가정해 보겠습니다.

CREATE TABLE Employees (
    EmployeeID INTEGER PRIMARY KEY,
    Name TEXT NOT NULL,
    Department TEXT
);

다음은 UPSERT를 사용하는 예시입니다:

INSERT INTO Employees (EmployeeID, Name, Department)
VALUES (1, 'John Doe', 'Marketing')
ON CONFLICT(EmployeeID) DO UPDATE SET
Name = excluded.Name,
Department = excluded.Department;

이 예시에서는 EmployeeID가 1인 직원을 Employees 테이블에 삽입하려고 시도합니다. 만약 EmployeeID 1이 이미 존재하는 경우, ON CONFLICT 절이 실행되어 해당 직원의 NameDepartment가 새로운 값으로 업데이트됩니다. excluded 키워드는 INSERT 시도 중에 사용된 값들을 참조하는 데 사용됩니다.

Previous
JOIN
Next
DELETE