Oracle DB Table 생성

심야·2023년 7월 14일
0

웹 개발

목록 보기
36/46
post-custom-banner

Table 생성

users

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가 반영된 시간, 즉 생성 시간을 자동으로 기입한다.

board

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으로 선언된다.

board sequence

create sequence seq_board_id
increment by 1 # 1씩 증가
start with 1 # 시작값 1
minvalue 1 # 최솟값 1
nomaxvalue # 최댓값은 무한대
nocycle # 순환하지 않음
nocache; # 캐시 안 함

oracle은 mysql과 auto increment 기능을 선언하려면 sequence를 만들어서 생성해야 한다.

foreign key (외래키)

alter table board
add constraint board_users_fk foreign key (user_id)
references users(user_id);

users 테이블의 user_id를 board 테이블의 외래키로 지정한다.

user_id를 외래키로 지정하여 users 테이블에 없는 계정이 게시글을 생성하는 것을 방지한다.

Ex) 게시글 생성 방지

inmo 라는 계정을 생성하였다 결과는 아래 그림과 같다.

insert into users(id, user_id, name, password, address) values(seq_users_id.nextval, ‘inmo', '인모', '1234', 'seoul');

INSERT 결과

이제 아래 쿼리를 사용해 게시글을 생성하겠다. 그런데 계정이 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); 

INSERT 결과

integrity constraint (INMO.BOARD_USERS_FK) violated - parent key not 에러가 발생하였다.

이 에러는 외래키 제약 조건 위반으로, 자식 테이블의 데이터에 부모 테이블의 없는 데이터를 추가하려고 할 때 발생한다. 아래 경우는 자식 테이블인 board 테이블 user_id 컬럼의 데이터가, 부모 테이블인 users 테이블 user_id 컬럼의 값과 일치하지 않아 발생한 것이다.

이번에는 user_id 컬럼을 inmo 로 변경해 쿼리를 날려보겠다.

수정된 INSERT 결과

쿼리가 정상적으로 반영되었고 아래 그림과 같이 테이블 행도 확인 가능하다.

profile
하루하루 성실하게, 인생 전체는 되는대로.
post-custom-banner

0개의 댓글