CREATE TABLE users (
user_id VARCHAR2(15) NOT NULL,
name VARCHAR2(20) NOT NULL,
password VARCHAR2(20) not null,
address VARCHAR2(50) not null,
regidate date default sysdate not null,
primary key(user_id)
);
user_id는 중복되지 않는 고유한 값이여야 하므로 기본키로 지정한다.
regidate는 insert query가 반영된 시간, 즉 생성 시간을 자동으로 기입한다.
create table board (
id number not null primary key,
user_id varchar2(15) not null,
name varchar(20) not null,
title varchar(200) not null,
content CLOB not null,
postdate date default sysdate not null,
original_file varchar2(200),
save_file varchar2(40),
visit_count number(6) default 0 not null,
like_count number(6) default 0 not null
);
id (일련번호)를 기본키로 지정한다.
content는 CLOB 타입을 사용한다. 이는 긴 문자열 데이터를 저장할 때 사용하는 데이터 타입이다.
데이터 크기가 매우 크기 때문에, 긴 텍스트나 문서 데이터를 저장하는데 사용된다.
visit_count, like_count는 default 0으로 지정했으므로 게시글 생성 시 초기값이 0으로 선언된다.
create sequence seq_board_id
increment by 1 # 1씩 증가
start with 1 # 시작값 1
minvalue 1 # 최솟값 1
nomaxvalue # 최댓값은 무한대
nocycle # 순환하지 않음
nocache; # 캐시 안 함
oracle은 mysql과 auto increment 기능을 선언하려면 sequence를 만들어서 생성해야 한다.
alter table board
add constraint board_users_fk foreign key (user_id)
references users(user_id);
users 테이블의 user_id를 board 테이블의 외래키로 지정한다.
user_id를 외래키로 지정하여 users 테이블에 없는 계정이 게시글을 생성하는 것을 방지한다.
inmo
라는 계정을 생성하였다 결과는 아래 그림과 같다.
insert into users(id, user_id, name, password, address) values(seq_users_id.nextval, ‘inmo', '인모', '1234', 'seoul');
이제 아래 쿼리를 사용해 게시글을 생성하겠다. 그런데 계정이 inmo
가 아니라 test
계정이다.
insert into board(id, user_id, name, title, content, postdate, visit_count, like_count) values(seq_board_id.nextval, 'test', '인모', '제목', '내용', sysdate, 0, 0);
integrity constraint (INMO.BOARD_USERS_FK) violated - parent key not
에러가 발생하였다.
이 에러는 외래키 제약 조건 위반으로, 자식 테이블의 데이터에 부모 테이블의 없는 데이터를 추가하려고 할 때 발생한다. 아래 경우는 자식 테이블인 board 테이블 user_id 컬럼의 데이터가, 부모 테이블인 users 테이블 user_id 컬럼의 값과 일치하지 않아 발생한 것이다.
이번에는 user_id
컬럼을 inmo
로 변경해 쿼리를 날려보겠다.
쿼리가 정상적으로 반영되었고 아래 그림과 같이 테이블 행도 확인 가능하다.