[SQLite] primary key, autoincrement πŸ”‘

seunghyunΒ·2023λ…„ 12μ›” 11일
0

πŸ’»

λͺ©λ‘ 보기
14/16

차이점, μ—°κ΄€μ„±

SQLiteμ—μ„œ AUTOINCREMENT와 PRIMARY KEYλŠ” μ„œλ‘œ λ‹€λ₯Έ κ°œλ…μ΄μ§€λ§Œ, λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ—μ„œ 고유 μ‹λ³„μžλ₯Ό μƒμ„±ν•˜λŠ” 데 ν•¨κ»˜ μ‚¬μš©λ©λ‹ˆλ‹€. 이 두 κ°œλ…μ˜ μ£Όμš” 차이점과 연관성을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

λ¨Όμ € AUTOINCREMENT ν•„λ“œλŠ” 주둜 λ°μ΄ν„°μ˜ κ³ μœ μ„±κ³Ό 식별성을 μœ μ§€ν•˜λŠ” 데 쀑점을 두며, μ΄λŠ” 데이터 무결성을 보μž₯ν•˜λŠ” 데 μ€‘μš”ν•©λ‹ˆλ‹€.

CREATE TABLE example (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT
);

PRIMARY KEYλŠ” 데이터 무결성을 보μž₯ν•˜κΈ° μœ„ν•΄ 각 행을 κ³ μœ ν•˜κ²Œ μ‹λ³„ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 반면, AUTOINCREMENTλŠ” 값이 μžλ™μœΌλ‘œ μ¦κ°€ν•˜λŠ” νŠΉμˆ˜ν•œ λ°©λ²•μž…λ‹ˆλ‹€.
AUTOINCREMENTλŠ” 주둜 κΈ°λ³Έ 킀에 적용되며, ν…Œμ΄λΈ”μ— μƒˆλ‘œμš΄ 행이 좔가될 λ•Œλ§ˆλ‹€ κ³ μœ ν•œ 숫자λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•©λ‹ˆλ‹€.
SQLiteμ—μ„œλŠ” INTEGER PRIMARY KEY 컬럼이 μžλ™μœΌλ‘œ autoincrementing 속성을 κ°–μŠ΅λ‹ˆλ‹€. λͺ…μ‹œμ μœΌλ‘œ AUTOINCREMENT ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„, SQLiteλŠ” INTEGER PRIMARY KEY μ»¬λŸΌμ— λŒ€ν•΄ μžλ™ 증가 κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ AUTOINCREMENT ν‚€μ›Œλ“œλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μΆ”κ°€ν•˜λ©΄, SQLiteλŠ” 숫자λ₯Ό μž¬μ‚¬μš©ν•˜μ§€ μ•Šκ³  항상 이전보닀 높은 숫자λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
PRIMARY KEY와 AUTOINCREMENTλŠ” ν•¨κ»˜ μ‚¬μš©λ  λ•Œ λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ—μ„œ 각 행을 κ³ μœ ν•˜κ³  순차적으둜 μ‹λ³„ν•˜λŠ” 데 맀우 νš¨κ³Όμ μž…λ‹ˆλ‹€.

μ˜ˆμ‹œ

ν…Œμ΄λΈ” μŠ€ν‚€λ§ˆ μ˜ˆμ‹œμž…λ‹ˆλ‹€.

######### CREATE 'video', 'channel' table in videos.db #########
def create_tables_videosDB():
    with sqlite3.connect('videos.db') as connection:
        cursor = connection.cursor()
        # channel ν…Œμ΄λΈ”
        cursor.execute("""
            CREATE TABLE channel (
                cid INTEGER PRIMARY KEY AUTOINCREMENT, 
                channel_id TEXT
            )
        """)
        connection.commit()

        # video ν…Œμ΄λΈ”
        cursor.execute("""
            CREATE TABLE video (
                vid INTEGER PRIMARY KEY AUTOINCREMENT,
                cid INTEGER,
                video_id TEXT,
                title TEXT,
                link TEXT,
                FOREIGN KEY (cid) REFERENCES channel(cid)
            )
        """)
        connection.commit()

그리고 μ•„λž˜μ˜ μΏΌλ¦¬λŠ” video ν…Œμ΄λΈ”κ³Ό channel ν…Œμ΄λΈ”μ„ cidλ₯Ό κΈ°μ€€μœΌλ‘œ κ²°ν•©ν•˜μ—¬, 두 ν…Œμ΄λΈ”μ˜ κ΄€λ ¨ 데이터λ₯Ό ν•¨κ»˜ μ‘°νšŒν•  수 있게 ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ°©μ‹μœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ ν…Œμ΄λΈ” κ°„μ˜ 관계λ₯Ό μ •μ˜ν•˜κ³  데이터λ₯Ό 효과적으둜 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

SELECT *
FROM video
INNER JOIN channel ON video.cid = channel.cid;

참고둜 INSERT μ—°μ‚°μ—μ„œ vid와 cid와 같은 AUTOINCREMENT ν•„λ“œλŠ” 직접 μ‚¬μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. INSERT 연산을 ν•  λ•Œ, μ΄λŸ¬ν•œ ν•„λ“œλŠ” 보톡 μƒλž΅λ˜λ©°, λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ΄ μžλ™μœΌλ‘œ 값을 ν• λ‹Ήν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, channel ν…Œμ΄λΈ”μ— μƒˆλ‘œμš΄ λ ˆμ½”λ“œλ₯Ό μΆ”κ°€ν•  λ•ŒλŠ” cid 값을 μ§€μ •ν•˜μ§€ μ•Šκ³  channel_id만 μ§€μ •ν•©λ‹ˆλ‹€.

INSERT INTO channel (channel_id) VALUES ('channel123');

이 경우, cidλŠ” μžλ™μœΌλ‘œ μƒμ„±λ˜λŠ” 고유 번호λ₯Ό λ°›κ²Œ λ©λ‹ˆλ‹€. AUTOINCREMENT ν•„λ“œλŠ” 주둜 λ°μ΄ν„°λ² μ΄μŠ€ λ‚΄λΆ€μ—μ„œ 각 λ ˆμ½”λ“œλ₯Ό μœ μΌν•˜κ²Œ μ‹λ³„ν•˜λŠ” 데 μ‚¬μš©λ˜λ©°, μ‚¬μš©μžκ°€ 직접 관리할 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

μ‚¬μš©

AUTOINCREMENT ν•„λ“œλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μ—°μ‚°μ—μ„œ λ‹€μŒκ³Ό 같이 μ‚¬μš©λ©λ‹ˆλ‹€:

  1. μ‚¬μš©λ˜λŠ” μ—°μ‚°: SELECT, JOIN, DELETE
    각 λ ˆμ½”λ“œμ˜ 고유 μ‹λ³„μžλ‘œ μ‚¬μš©λ˜μ–΄, 데이터 μ‘°νšŒλ‚˜ λ‹€λ₯Έ ν…Œμ΄λΈ”κ³Όμ˜ 관계λ₯Ό λͺ…ν™•ν•˜κ²Œ ν•©λ‹ˆλ‹€.

  2. μ‚¬μš©λ˜μ§€ μ•ŠλŠ” μ—°μ‚°: INSERT, UPDATE
    INSERT μ—°μ‚° μ‹œ AUTOINCREMENT ν•„λ“œλŠ” 일반적으둜 μƒλž΅λ©λ‹ˆλ‹€. λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ΄ μžλ™μœΌλ‘œ κ³ μœ κ°’μ„ ν• λ‹Ήν•˜λ―€λ‘œ, κ°œλ°œμžκ°€ 직접 지정할 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ 방식은 데이터 무결성을 보μž₯ν•˜κ³  데이터 관리λ₯Ό κ°„μ†Œν™”ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€. AUTOINCREMENT ν•„λ“œλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μžλ™ κ΄€λ¦¬λ˜λ―€λ‘œ, μ‚¬μš©μžλŠ” λ ˆμ½”λ“œμ˜ κ³ μœ μ„±μ„ μ‹ κ²½ μ“Έ ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.


πŸ”— Reference

0개의 λŒ“κΈ€