지금까지 읽기, 쓰기, 삭제, 조회를 했다.
이번에는 기본키
에 대해서 알아보자!
그전에!
set linesize 수;
이때까지 불편하게 새로로 보이던 것을, linsize
를 200으로 설정해줘서 그래도 한줄에 테이블처럼 보이게 했다!
topic 테이블의 id
컬럼은 식별자
, 즉 남과 나를 구별하는 역할을 한다.
식별자가 되기위한 가장 중요한 특징은 중복되면 안된다.
이전에 지웠던 id=3
인 데이터를 다시 추가하려 한다고 하자.
그런데, id로 구분하려는데 이전에 topic테이블에 id가 3인 행이 있는지 없는지 알기는 매우 까다롭다.
그래서, 만약 id가 3인 행이 있다면 insert문 실행을 하지 않고, 없을 때만 실행을 시켜 준다면, id
값이 유니크한 식별자라는 것을 확신할 수 있다.
이 역할을 해주는 것이 PRIMARY KEY
이다.
우리가 이전에 작성했던 topic테이블 생성 코드에는 기본키
지정 코드가 없다.
CREATE TABLE topic(
id NUMBER NOT NULL,
title VARCHAR2(50) NOT NULL,
description VARCHAR2(4000) NULL,
created DATE NOT NULL
);
기본키
를 생성하는 방법은 ALTER
를 통해 추가하거나 테이블 생성시
에 지정해주는 두가지 방법이 있다.
하지만, 테이블 생성시에 미리 지정하는 것이 제일 좋은 방법이다.
먼저, 기존 topic 테이블을 없애버리자. 그래야 새로운 topic 테이블을 생성할 수 있으니까!
DROP TABLE 테이블명;
DDL
다음은 commit명령어는 필요없다.
기본키 지정 코드를 추가해서 테이블을 생성해보자!
CREATE TABLE 테이블명(
컬럼명 데이터타입 [NULL|NOT NULL],
컬럼명 데이터타입 [NULL|NOT NULL],
...,
CONSTRAINT 제약조건이름 PRIMARY KEY(컬럼명[,컬럼명,...])
);
위 처럼 제약조건 이름을 지정해줄 수 있고,
아니면
CREATE TABLE 테이블명(
컬럼명 데이터타입 [NULL|NOT NULL],
컬럼명 데이터타입 [NULL|NOT NULL],
...,
PRIMARY KEY(컬럼명[,...])
);
위에 처럼 바로 기본키 지정만 해줄 수도 있다!
topic테이블의 id
를 기본키로 지정해보자.
CREATE TABLE topic(
id NUMBER NOT NULL,
title VARCHAR2(50) NOT NULL,
description VARCHAR2(4000) NULL,
created DATE NOT NULL,
CONSTRAINT PK_TOPIC PRIMARY KEY(id)
);
CONSTRAINT
는 제약조건이라는 의미다. PRIMARY KEY
다음에는 식별자로 지정할 컬럼명을 입력한다!
잘 동작하는지 테스트해보자.
이전에 작성했던 insert
문 중 2개를 들고와서 먼저 실행시켜보자.
INSERT INTO topic(id, title, description, created)
VALUES (1,'ORACLE','ORACLE is ...', SYSDATE);
INSERT INTO topic(id, title, description, created)
VALUES (2,'MySQL','MySQL is ...', SYSDATE);
commit
을 꼭 하자!
여기서, 세번째 행을 추가할 때 id
값을 3이 아니라 1
또는 2
로 했다고 가정해보자.
INSERT INTO topic(id, title, description, created)
VALUES (1,'SQL Server','SQL Server is ...', SYSDATE);
실행시키면..
무결성 제약 조건
위배했다는 오류가 뜬다!
그러므로, 3으로 수정해서 넣자!
where
절에 기본키
를 넣어서 검색하는 것과, 그렇지 않은 경우의 속도 차이는 인덱스
때문에 매우 크다.
(기본키에는 자동으로 인덱스가 지정되니까..)