SQLite에서 중복 방지

Bilal Shahid 2023년6월21일
SQLite에서 중복 방지

데이터베이스를 채울 때 발생할 수 있는 가장 일반적인 문제 중 하나는 데이터 중복입니다. 이는 많은 사용자, 특히 대규모 데이터베이스를 사용하는 사용자에게 문제가 될 수 있습니다.

상당한 비용이 들 수 있는 메모리 낭비를 포함하여 다양한 문제가 있을 수 있습니다.

어쨌든 삽입하는 동안 이상적으로는 피하는 것이 필요합니다. 이렇게 하면 처음부터 모든 액세스 데이터가 데이터베이스에 들어가는 것을 방지할 수 있습니다.

SQLite에서 중복 항목을 피하는 방법

SQLite에는 중복 항목을 방지하는 여러 가지 방법이 있습니다. 이러한 각 방법을 구별하는 주된 이유는 다음과 같습니다.

  1. 적용의 용이성.
  2. 효과율.
  3. 데이터베이스 요구 사항.

수동 제거

고급 데이터베이스 쿼리 이전에는 항목을 검토하고 중복을 식별하는 것이 일반적이었습니다. 레코드가 거의 없는 데이터베이스에서도 여전히 작동할 수 있습니다.

그러나 이것은 모든 경우에 비효율적이며 훨씬 더 큰 데이터베이스에는 사용할 수 없습니다. 이러한 문제는 이 방법이 거의 사용되지 않는 이유입니다.

고급 중첩 쿼리 사용

고급 중첩 쿼리는 올바르게 적용되면 무엇이든 할 수 있습니다. 그러나 이것은 종종 감사하지 않습니다.

그것들을 설계하는 것은 종종 복잡하고 모든 경우에 정확하지 않을 수 있습니다. 따라서 이 방법이 작동하더라도 더 간단한 방법이 있으므로 권장하지 않습니다.

UNIQUE 제약 조건

이 제약 조건은 테이블 생성 중에 SQLite에서 종종 적용됩니다. 행에 적용하면 사용자가 동일한 행의 데이터베이스에 중복 항목을 입력하는 것을 방지합니다.

이 제약 조건은 기본 키 제약 조건을 사용할 때도 자동으로 적용됩니다. 다음 코드를 사용하여 테이블을 만들고 고유 제약 조건을 적용할 수 있습니다.

CREATE TABLE users(
    users_id INTEGER,
    user_age INTEGER,
    UNIQUE(users_id, lessoninfo_id)
);

다음과 같이 직접 적용할 수도 있습니다.

CREATE TABLE users(
   users_id INTEGER UNIQUE,
    user_age INTEGER
);

테이블을 이미 생성했고 행을 고유하게 만들기 위해 수정을 추가해야 하는 경우 전체 테이블을 삭제해야 합니다. 아래 코드와 같이 고유 인덱스를 선택할 수도 있습니다.

CREATE UNIQUE INDEX index_name
ON users(users_id);

EXISTS

‘Exists’는 쿼리 및 중첩된 쿼리에서 자주 사용됩니다. 복잡한 쿼리를 훨씬 더 단순화된 쿼리로 줄이는 것은 쉽습니다.

반대는 NOT EXISTS 절로, 이는 정반대를 의미합니다. 아래와 같이 삽입 후 쿼리에서 사용할 수 있습니다.

먼저 테이블이 이미 생성되어 있는지 확인하십시오. 다음 코드를 사용하여 그렇게 할 수 있습니다.

CREATE TABLE users(
   users_id INTEGER,
    user_age INTEGER
);

그런 다음 쿼리 작성을 시작하십시오. 절을 올바르게 사용하려면 아래 코드를 참조하십시오.

SELECT *
FROM users
WHERE EXISTS
(
--any query with your preferred conditions
)

참고: 여기에서 EXISTSNOT EXISTS로 바뀌면 반대 결과가 나타납니다.

아래에서 설명한 것처럼 절을 다르게 사용하여 삽입하는 동안 이 논리를 직접 적용할 수도 있습니다.

존재하지 않음인 경우 삽입

데이터베이스의 테이블에 값을 삽입하는 쿼리를 생성하는 동안 가장 일반적으로 가장 많이 사용되는 방법은 존재하지 않는 경우 삽입을 사용하는 것입니다.

이는 데이터를 삽입하는 쿼리와 결합하여 존재하지 않음 절을 사용하는 더 좋은 방법이라고 볼 수 있습니다. 이에 대한 예가 아래 코드에 나와 있습니다.

먼저 테이블을 만듭니다.

CREATE TABLE users(
   users_id INTEGER,
    user_age INTEGER
);

그런 다음 아래 코드와 같은 쿼리를 설계합니다.

INSERT INTO users(users_id,user_age)
SELECT * /*user whose id isn't 1.*/
WHERE NOT EXISTS
(
SELECT 1 FROM memos WHERE id = 5 AND name= 'abc'
);

레이블에서 알 수 있듯이 이 쿼리는 사용자 id가 1이 아닌 해당 사용자 또는 데이터 항목만 표시합니다. 괄호 안의 쿼리를 요구 사항에 따라 변경하여 언제든지 조건을 변경할 수 있습니다.

‘삽입 또는 무시’

SQLite에서 중복성을 추가하는 것을 방지하는 또 다른 방법은 삽입 또는 무시 절입니다. 삽입이 미리 정의된 용어를 위반하는 경우 삽입이 무시됩니다.

쿼리는 성공적으로 실행되지만 삽입되지는 않습니다.

기본 키가 존재하는 또 다른 예를 들어 보겠습니다. 기본 키에는 중복 항목이 허용되지 않음을 의미하는 고유 제약 조건이 존재합니다.

다음과 같이 기본 키를 사용하여 먼저 테이블이 생성됩니다.

CREATE TABLE users
(
id INTEGER NOT NULL PRIMARY KEY,
age INTEGER
);

아래와 같이 무시 조건으로 값을 삽입할 수 있습니다.

INSERT OR IGNORE
INTO users(id, age) VALUES(123, 24)

ID가 123인 사용자가 이미 존재한다고 가정하면 이 삽입이 발생하지 않으며 원래 테이블에 변경 사항이 없습니다.

참고: 값을 삽입하는 열에 대한 고유 제약 조건이 없으면 레코드가 항상 삽입됩니다.

REPLACE

ignore 절을 사용하는 대신 대체하도록 선택할 수도 있습니다. 특정 행에 고유 제약 조건(또는 기본 키)이 적용된 경우 삽입된 값이 고유한지 여부를 먼저 확인하므로 ignore 절과 유사합니다.

여기서 차이점은 고유 제약 조건이 있는 레코드가 이미 있는 경우 삽입하려는 새 레코드로 대체된다는 것입니다.

INSERT OR REPLACE
INTO users(id, age) VALUES(123, abc)

여기에서 id가 123인 사용자가 이미 테이블에 있으면 이름이 abc로 대체됩니다.

이것이 SQLite에서 중복 항목을 피하는 방법에 대해 알아야 할 모든 것입니다. 이제 귀하의 요구 사항을 충족하고 가장 효율적인 데이터베이스를 생성하기 위해 수행할 작업을 정확히 알고 있기를 바랍니다.

작가: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

관련 문장 - SQLite Insert