1. 일련번호 필드
🍊 기본키는 레코드의 유일성을 보장할 뿐만 아니라 관계를 형성하는 중요한 역할
🍊 그러나 기본키가 강제 규정은 아니어서 의무적으로 만들어야 하는 것은 아니며 기본키로 쓸만한 필드가 없는 경우도 발생
🔖 다음은 슈퍼마켓의 매출 데이터이며 누가 어떤 상품을 구매했는지 기록
손님
|
상품
|
단군
|
지팡이
|
고주몽
|
고등어
|
박혁거세
|
계란
|
대조영
|
라면
|
박혁거세
|
화장지
|
고주몽
|
라면
|
📍 이 경우 중복되지 않는 필드가 없어 기본키로 쓸만한 적당한 필드가 없음
📍 정보 저장은 가능하지만 레코드를 식별하는 수단이 없어 검색이나 참조가 번거롭다.
🔎 고주몽이 라면을 반품했다면 구입 기록을 삭제해야 하나 고주몽을 찾아 삭제하면 고등어도 같이 반품되고,
라면을 찾아 삭제하면 대조영이 산 라면도 삭제 된다.
🔎 손님과 상품을 모두 점검해서 레코드를 찾아야 하는데, 이 방법도 고주몽이 라면을 어제도 사고 오늘도 샀다면 완벽하지 않음.
⚡️ 억지로라도 기본키를 만드는 것이 좋은데 이때 유용한 값이 일련번호
⚡️ 계속 증가하는 일련번호를 붙이면 NULL도 아니고 고유성도 부여할 수 있음
🔖 위 테이블에 판매번호 필드를 추가
판매번호
|
손님
|
상품
|
1
|
단군
|
지팡이
|
2
|
고주몽
|
고등어
|
3
|
박혁거세
|
계란
|
4
|
대조영
|
라면
|
5
|
박혁거세
|
화장지
|
6
|
고주몽
|
라면
|
📍 이제 일련번호만 알면 레코드를 특정할 수 있음
⚡️ 정수값 하나로 레코드를 식별할 수 있어 다른 조건은 더 필요 없다
⚡️ 판매번호를 PK로 지정하면 인덱스까지 생성하여 검색 속도가 빨라지고 다른 테이블과 관계를 맺을 수도 있음
⚡️ 일련번호를 붙이는 방법이 DBMS별로 조금씩 달라 각각 따로 익혀야 하는 불편함이 있음
2. 시퀀스
🍊 오라클과 SQL Server는 일련번호를 관리하는 시퀀스(SEQUENCE) 객체를 지원
➡️ 시퀀스는 객체를 초기화해 놓기만 하면 요청할 때마다 증가한 값을 자동으로 돌려줌
3. 자동 생성 시퀀스
🍊 시퀀스는 보통 특정 테이블의 필드 하나를 위해 생성하며 공유하는 경우가 적다.
🍊 따로 객체를 만드는 것보다 테이블을 만들 때 아예 시퀀스 필드로 지정하는 것이 효율적임
💡 단, 이 기능은 오라클만 지원
4. ID 필드
🍊 SQL Server는 일련번호를 붙이는 더 간편한 방법을 제공한다.
🍊 자동 생성 시퀀스는 지원하지 않지만 비슷한 기능의 IDENTITY 속성이 있다.
5. AUTO_INCREMENT
💡 MariaDB는 시퀀스를 지원하지 않는다.
💡 대신 IDENTITY와 거의 유사한 AUTO_INCREMENT 구문을 지원한다.
💡 필드 선언문에 AUTO_INCREMENT라고 선언하면 자동 증가하는 일련번호가 매겨진다.
CREATE TABLE tSale
(
saleno INT AUTO_INCREMENT PRIMARY KEY,
customer NCHAR(10),
product NCHAR(30)
);
INSERT INTO tSale (customer, product) VALUES ('단군', '지팡이');
INSERT INTO tSale (customer, product) VALUES ('고주몽', '고등어');
📌 saleno는 1부터 1씩 증가하는 일련번호이며 초기값, 증가값은 지정할 수 없다.
📌 삽입할 때 saleno는 빼고 나머지 필드의 값만 지정
DELETE FROM tSale WHERE saleno = 2;
INSERT INTO tSale (customer, product) VALUES ('박혁거세', '계란');
📌 시퀀스나 IDENTITY와 마찬가지로 삭제한 일련번호는 재사용하지 않음
📌 2번을 지운 후 삽입하면 3번으로 들어감
⚡️ 일련번호를 특정값으로 지정하는 것은 항상 가능하다.
⚡️ 다만 PK 제약상 기존 일련번호와 중복되지는 말아야 함
INSERT INTO tSale (saleno, customer, product) VALUES (2,'고주몽', '고등어');
📌 2번 레코드를 제자리에 다시 삽입.
💡 일련번호를 특정값으로 리셋할 때는 ALTER 명령을 사용
💡 일련번호를 리셋하면 이후 삽입하는 레코드는 리셋한 번호부터 순서대로 증가하는 값을 받는다.
💡 최후값을 알아낼 때는 LAST_INSERT_ID() 함수를 사용
ALTER TABLE tSale AUTO_INCREMENT = 100;
INSERT INTO tSale (customer, product) VALUES ('왕건', '너구리');
// 다음은 왕건이 구입한 너구리의 구매 기록을 찾아 짜파게티로 변경.
UPDATE tSale SET product = '짜파게티' WHERE saleno = LAST_INSERT_ID();
💡 자동 증가하는 일련번호 필드를 만드는 방법이 DBMS마다, 버전에 따라 다름
💡 단순히 자동 증가 필드를 만드는 것만이 목적이라면 다음 방법을 쓰는 것이 무난하다.
* 오라클 : saleno INT GENERATED AS IDENTITY PRIMARY KEY * SQL Server : saleno INT IDENTITY PRIMARY KEY * MariaDB : saleno INT AUTO_INCREMENT PRIMARY KEY |
⚡️ 이렇게만 해도 자동 증가열의 이점을 충분히 누릴 수 있고, 용어와 구문이 다를 뿐 개념은 같음
[ 내용 참고 : IT 학원 강의 ]
'Database > MySQL' 카테고리의 다른 글
[MySQL] 데이터베이스 모델링 | 1~3 정규화, 역정규화 (1) | 2024.02.25 |
---|---|
[MySQL] 데이터베이스 모델링 | 진행단계, 분류, 엔티티, 관계 (0) | 2024.02.25 |
[MySQL] 제약조건 | 식별자, 기본키, 복합키, 유니크, 체크 (1) | 2024.02.24 |
[MySQL] 제약조건 | 무결성, NULL 허용, 기본값 (1) | 2024.02.24 |
[MySQL] 서브쿼리 (SubQuery) (1) | 2024.02.24 |