SQLite에서 중복 방지
데이터베이스를 채울 때 발생할 수 있는 가장 일반적인 문제 중 하나는 데이터 중복입니다. 이는 많은 사용자, 특히 대규모 데이터베이스를 사용하는 사용자에게 문제가 될 수 있습니다.
상당한 비용이 들 수 있는 메모리 낭비를 포함하여 다양한 문제가 있을 수 있습니다.
어쨌든 삽입하는 동안 이상적으로는 피하는 것이 필요합니다. 이렇게 하면 처음부터 모든 액세스 데이터가 데이터베이스에 들어가는 것을 방지할 수 있습니다.
SQLite에서 중복 항목을 피하는 방법
SQLite에는 중복 항목을 방지하는 여러 가지 방법이 있습니다. 이러한 각 방법을 구별하는 주된 이유는 다음과 같습니다.
- 적용의 용이성.
- 효과율.
- 데이터베이스 요구 사항.
수동 제거
고급 데이터베이스 쿼리 이전에는 항목을 검토하고 중복을 식별하는 것이 일반적이었습니다. 레코드가 거의 없는 데이터베이스에서도 여전히 작동할 수 있습니다.
그러나 이것은 모든 경우에 비효율적이며 훨씬 더 큰 데이터베이스에는 사용할 수 없습니다. 이러한 문제는 이 방법이 거의 사용되지 않는 이유입니다.
고급 중첩 쿼리 사용
고급 중첩 쿼리는 올바르게 적용되면 무엇이든 할 수 있습니다. 그러나 이것은 종종 감사하지 않습니다.
그것들을 설계하는 것은 종종 복잡하고 모든 경우에 정확하지 않을 수 있습니다. 따라서 이 방법이 작동하더라도 더 간단한 방법이 있으므로 권장하지 않습니다.
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
)
참고: 여기에서
EXISTS
가NOT 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에서 중복 항목을 피하는 방법에 대해 알아야 할 모든 것입니다. 이제 귀하의 요구 사항을 충족하고 가장 효율적인 데이터베이스를 생성하기 위해 수행할 작업을 정확히 알고 있기를 바랍니다.
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