SQLite 오류 처리

SQLiteBeginner
지금 연습하기

소개

이 랩에서는 SQLite 데이터베이스에서 오류를 효과적으로 처리하는 방법을 배우게 됩니다. 주요 초점은 ON CONFLICT 절을 사용하여 INSERT 작업 중 제약 조건 위반을 관리하는 것입니다.

먼저 데이터베이스와 UNIQUE 제약 조건이 있는 테이블을 생성하는 것으로 시작합니다. 그런 다음, 충돌이 발생했을 때 ROLLBACK, ABORT, FAIL, IGNORE, 또는 REPLACE와 같은 다양한 조치를 탐색합니다. 특히, 고유 제약 조건이 위반될 때 삽입을 방지하기 위해 ON CONFLICT IGNORE를 사용합니다. 이 랩에서는 데이터를 삽입하고 잠재적인 오류를 처리하는 실용적인 예제를 안내합니다.

UNIQUE 제약 조건이 있는 SQLite 데이터베이스 및 테이블 생성

이 단계에서는 SQLite 데이터베이스와 UNIQUE 제약 조건이 있는 테이블을 생성합니다. 이 제약 조건은 중복 데이터를 삽입할 때 오류를 처리하는 방법을 이해하는 데 도움이 됩니다.

먼저, LabEx VM 에서 터미널을 엽니다. 기본 경로는 /home/labex/project입니다.

이제 my_database.db라는 SQLite 데이터베이스를 생성해 보겠습니다. 다음 명령을 실행하여 데이터베이스 파일을 생성하고 SQLite 명령줄 도구를 엽니다.

sqlite3 my_database.db

SQLite 셸 내부에 있다는 것을 나타내는 프롬프트가 표시됩니다.

SQLite version 3.x.x
Enter ".help" for usage hints.
sqlite>

다음으로, 사용자 정보를 저장할 users라는 테이블을 생성합니다. 이 테이블에는 id, username, 및 email의 세 개의 열이 있습니다. username 열에는 UNIQUE 제약 조건이 있어 각 사용자 이름이 테이블 내에서 고유해야 합니다. sqlite> 프롬프트에서 다음 SQL 명령을 입력하고 Enter 키를 누릅니다.

CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT UNIQUE NOT NULL,
    email TEXT NOT NULL
);

이 명령은 users 테이블을 설정합니다. 여기서:

  • id는 각 새 항목에 대해 자동으로 증가하는 정수입니다. PRIMARY KEY 제약 조건은 각 id가 고유하도록 보장하고, AUTOINCREMENT는 자동으로 증가하도록 합니다.
  • username은 비워둘 수 없는 (NOT NULL) 텍스트 필드이며 고유해야 합니다 (UNIQUE).
  • email도 비워둘 수 없는 (NOT NULL) 텍스트 필드입니다.

명령이 성공적으로 실행되면 아무런 출력도 표시되지 않습니다.

테이블에 데이터 삽입

users 테이블을 생성했으므로 이제 데이터를 추가해 보겠습니다. 테이블에 사용자 레코드를 삽입합니다.

sqlite> 프롬프트에서 다음 명령을 실행하여 users 테이블에 사용자 레코드를 삽입합니다.

INSERT INTO users (username, email) VALUES ('Alice', 'alice@example.com');

이 명령은 users 테이블에 행을 추가합니다.

  • INSERT INTO users (username, email)users 테이블의 usernameemail 열에 데이터를 삽입함을 지정합니다.
  • VALUES ('Alice', 'alice@example.com')은 각 레코드에 대해 삽입할 값을 제공합니다.

데이터가 올바르게 추가되었는지 확인하려면 다음 명령을 실행하여 테이블의 모든 레코드를 봅니다.

SELECT * FROM users;

예상 출력:

1|Alice|alice@example.com

이 출력은 레코드의 id, username, 및 email을 보여줍니다. SELECT * 명령은 지정된 테이블에서 모든 열을 검색합니다.

중복 데이터 삽입 시도

이 단계에서는 중복 사용자 이름으로 레코드를 삽입하려고 시도합니다. 이렇게 하면 UNIQUE 제약 조건이 위반되어 오류가 발생합니다.

sqlite> 프롬프트에서 다음 명령을 실행합니다.

INSERT INTO users (username, email) VALUES ('Alice', 'alice2@example.com');

다음과 유사한 오류 메시지가 표시됩니다.

Error: UNIQUE constraint failed: users.username

이 오류 메시지는 username 열에 대한 UNIQUE 제약 조건이 위반되었음을 나타냅니다. SQLite 는 데이터 무결성을 유지하기 위해 중복 사용자 이름의 삽입을 방지합니다.

ON CONFLICT IGNORE 를 사용하여 제약 조건 위반 처리

이 단계에서는 ON CONFLICT IGNORE 절을 사용하여 제약 조건 위반을 처리하는 방법을 배웁니다. 이 절은 제약 조건을 위반하는 경우 SQLite 가 삽입을 무시하도록 지시합니다.

sqlite> 프롬프트에서 다음 명령을 실행합니다.

INSERT OR IGNORE INTO users (username, email) VALUES ('Alice', 'alice2@example.com');

이 명령은 사용자 이름 'Alice'로 새 레코드를 삽입하려고 시도합니다. 그러나 ON CONFLICT IGNORE 절이 사용되었으므로 SQLite 는 삽입을 무시하고 오류가 발생하지 않습니다.

중복 레코드가 삽입되지 않았는지 확인하려면 다음 명령을 실행합니다.

SELECT * FROM users;

예상 출력:

1|Alice|alice@example.com

출력은 사용자 이름 'Alice'가 있는 원래 레코드만 테이블에 존재함을 보여줍니다. 중복 레코드는 무시되었습니다.

INSERT OR IGNORE 문은 제약 조건을 위반할 수 있는 데이터를 삽입할 때 오류를 방지하고 데이터 무결성을 유지하는 방법을 제공합니다.

ON CONFLICT REPLACE 를 사용하여 제약 조건 위반 처리

이 단계에서는 ON CONFLICT REPLACE 절을 사용하여 제약 조건 위반을 처리하는 방법을 배웁니다. 이 절은 제약 조건을 위반하는 경우 SQLite 가 기존 레코드를 새 레코드로 대체하도록 지시합니다.

sqlite> 프롬프트에서 다음 명령을 실행합니다.

INSERT OR REPLACE INTO users (id, username, email) VALUES (1, 'Alice', 'alice3@example.com');

이 명령은 사용자 이름 'Alice'로 새 레코드를 삽입하려고 시도합니다. ON CONFLICT REPLACE 절이 사용되었으므로 SQLite 는 기존 레코드를 새 레코드로 대체합니다. 이 경우 id를 지정해야 합니다. REPLACE는 이전 행을 삭제하고 새 행을 삽입하기 때문입니다.

레코드가 대체되었는지 확인하려면 다음 명령을 실행합니다.

SELECT * FROM users;

예상 출력:

1|Alice|alice3@example.com

출력은 사용자 이름 'Alice'가 있는 레코드의 이메일 주소가 alice3@example.com으로 업데이트되었음을 보여줍니다.

INSERT OR REPLACE 문은 데이터 무결성을 유지하면서 기존 레코드를 업데이트하는 방법을 제공합니다.

마지막으로, SQLite 셸을 종료합니다.

.exit

이렇게 하면 데이터베이스 연결이 닫히고 터미널로 돌아갑니다.

요약

이 랩에서는 INSERT 작업 중 제약 조건 위반에 중점을 두고 SQLite 데이터베이스에서 오류를 효과적으로 처리하는 방법을 배웠습니다. 데이터베이스와 UNIQUE 제약 조건이 있는 테이블을 생성하고 데이터를 삽입한 다음, 중복 데이터를 삽입하여 오류를 발생시키려고 시도했습니다. 그런 다음, 이러한 제약 조건 위반을 처리하기 위해 ON CONFLICT IGNOREON CONFLICT REPLACE 절을 사용하는 방법을 탐구하여 SQLite 가 잠재적인 오류에 어떻게 대응하고 데이터 무결성을 유지할지 제어할 수 있도록 했습니다.