Project/과정 기록
[데이터베이스] 팀별 미니프로젝트 _ 게시판 / 회원정보 ERD 만들기
minulbora
2024. 1. 3. 15:19
📑시퀀스
: 여러 사용자에게 유일(UNIQUE)한 값을 생성해 주는 오라클 객체
즉, 시퀀스를 사용하여 테이브르이 기본 키와 같이 순차적으로 증가하는 값을 가지는 컬럼 값을 자동으로 생성할 수 있음.
사용 예) CREATE SEQUENCE 시퀀스 명
[START WITH n] : 시퀀스의 시작값을 n으로 지정(기본시작값은 1)
[INCREMENT BY n] : 시퀀스의 증가값을 n으로 지정(기본값은 1, 여기서 n은 0이 될 수 없음)
[MAXVALUE n | NOMAXVALUE] : 최대값 (NOMAX~무한대, MAX~1028 기본값)
[MINVALUE n | NOMINVALUE] : 최소값 (기본값 1, NOMIN = 최소값 무한대로 지정 가능)
[CYCKE | NOCYCLE] : 최대값까지 증가 후 MIN으로 돌아가는 옵션 ( 기본 NOC~)
[CACHE | NOCACHE]; : 캐시 사용(NOC~ 기본값은 한번에 20개 캐시)
--SEQUENCE
SELECT * FROM USER_SEQUENCES;
CREATE SEQUENCE EX_SEQ
INCREMENT BY 1
START WITH 50
MINVALUE 1
MAXVALUE 99
NOCYCLE
NOCACHE;
SELECT EX_SEQ.NEXTVAL
FROM DUAL;
SELECT EX_SEQ.CURRVAL
FROM DUAL;
SELECT* FROM DEPT;
INSERT INTO DEPT VALUES (EX_SEQ.NEXTVAL, '기획팀', '서울강남구');
CREATE SEQUENCE EX_TEST_SEQ
INCREMENT BY 10
START WITH 70
MINVALUE 1
MAXVALUE 90
CYCLE
NOCACHE;
SELECT EX_TEST_SEQ.NEXTVAL
FROM DUAL;
DROP SEQUENCE EX_TEST_SEQ;
--직원번호와 관련한 시퀀스 생성
SELECT MAX (EMPNO) FROM EMP;
CREATE SEQUENCE EX_EMPNO_SEQ
INCREMENT BY 1
START WITH 2004
MINVALUE 1001
MAXVALUE 9999
NOCYCLE
NOCACHE;
SELECT MAX(EMPNO)+1 FROM EMP;
--두가지 방법 ( MAX+1 / SEQUENCE )을 사용할 수 있다.
INSERT INTO EMP (EMPNO, ENAME, HIREDATE,DEPTNO)
VALUES ((SELECT MAX(EMPNO)+1 FROM EMP),'TEST1',SYSDATE,'20'); -- 이 경우 문제가 되는 것은 동시접속의 경우.
COMMIT;
INSERT INTO EMP (EMPNO, ENAME, HIREDATE,DEPTNO)
VALUES(EX_EMPNO_SEQ.NEXTVAL,'TEST2',SYSDATE,'20');
SELECT EX_EMPNO_SEQ.CURRVAL FROM DUAL;
--SEQUENCE는 TABLE이랑 별도 객체이기 때문에. 실행에 실패했더라도 일단 COUNT 되고 넘어간다.
팀별과제 (문제)
1. 회원 테이블 만들기
회원(일반 사용자)
테이블명은 T_USER
회원가입시 필요한 컬럼을 정의하고, 회원 상태(사용(Y), 정지(N))를 관리할 수 있도록 정의
각 컬럼에 대한 COMMENT를 적용하여 컬럼의 의미를 전달할 수 있도록 함.
사용자 ID를 PK로 정의함 (단, PK 정의는 TABLE 생성 후에)
2. 게시판 테이블(댓글 관련 자율)
테이블명은 T_BOARD로, 게시판 글 번호는 NUMBER(12)로 정하고, 시퀀스는 SEQ_BOARD로 정의함.
각 컬럼에 대한 COMMENT 적용하고, 컬럼의 의미를 전달할 수 있도록 함.
게시판 글 번호를 PK로 정의함. (단, 테이블 생성 후 PK 생성)
게시판 조회 갯수를 관리. 크기는 게시판 글 번호와 동일하게 적용함.
게시판 테이블은 글 제목, 글 내용(TEXTAREA) , 조회수 등으로 이루어져 있음.
CREATE TABLE T_USER (
U_UNAME VARCHAR2(20),
U_EMAIL VARCHAR(20),
U_PHONE NUMBER(12),
U_BIRTH CHAR(8),
U_GENDER CHAR(1),
U_STATE CHAR(1)
CONSTRAINT T_USER_U_STATE
CHECK(U_STATE IN ('Y', 'N')),
U_ID VARCHAR(10) NOT NULL,
U_PASSWORD VARCHAR(12) NOT NULL,
U_DATE DATE
);
COMMENT ON COLUMN T_USER.U_UNAME IS '이름';
COMMENT ON COLUMN T_USER.U_ID IS '아이디';
COMMENT ON COLUMN T_USER.U_PASSWORD IS '비밀번호';
COMMENT ON COLUMN T_USER.U_EMAIL IS '이메일';
COMMENT ON COLUMN T_USER.U_PHONE IS '전화번호';
COMMENT ON COLUMN T_USER.U_BIRTH IS '생년월일';
COMMENT ON COLUMN T_USER.U_GENDER IS '성별';
COMMENT ON COLUMN T_USER.U_STATE IS '회원 상태';
--PK 지정
ALTER TABLE T_USER
ADD CONSTRAINT PK_U_ID PRIMARY KEY (U_ID);
--게시판 테이블
CREATE TABLE T_BOARD
(
BOARD_N NUMBER(12), -- 게시판 글 번호 (PK)
TITLE VARCHAR2(20), -- 글 제목
TEXTAREA CLOB, -- 글 내용
U_ID VARCHAR2(10), -- 작성자 아이디 (FK)
VIEW_N NUMBER(12), -- 조회수
WRITE_T DATE -- 글 작성 시간
);
COMMENT ON COLUMN T_BOARD.BOarD_N IS '게시판 글 번호';
COMMENT ON COLUMN T_BOARD.TITLE IS '글 제목';
COMMENT ON COLUMN T_BOARD.TEXTAREA IS '글 내용';
COMMENT ON COLUMN T_BOARD.U_ID IS '작성자 아이디';
COMMENT ON COLUMN T_BOARD.VIEW_N IS '조회수';
COMMENT ON COLUMN T_BOARD.WRITE_T IS '글 작성 시간';
--PK 지정
ALTER TABLE T_BOARD
ADD CONSTRAINT PK_BOARD_N PRIMARY KEY (BOARD_N);
--FK 지정
ALTER TABLE T_BOARD
ADD CONSTRAINTS FK_U_ID FOREIGN KEY (U_ID)
REFERENCES T_USER(U_ID);
--시퀀스 ( 글번호 )
CREATE SEQUENCE SEQ_BOARD
INCREMENT BY 1
START WITH 1
MINVALUE 1
MAXVALUE 999999999999
NOCYCLE
NOCACHE;
--글번호 INSERT 문
INSERT INTO T_BOARD (BOARD_N)
VALUES(EX_EMPNO_SEQ.NEXTVAL);
DROP TABLE T_BOARD;
DROP TABLE T_USER;
--댓글 TABLE
CREATE TABLE T_COMMENT (
COMMENT_N NUMBER(12), --댓글번호
T_TEXTAREA CLOB, --글 내용
T_DATE DATE DEFAULT SYSDATE, --작성일시
BOARD_N NUMBER(12), --게시판 글 번호(FK)
U_ID VARCHAR2(10) --댓글작성자
);
--PK
ALTER TABLE T_COMMENT
ADD CONSTRAINT PK_COMMENT_N PRIMARY KEY (COMMENT_N);
오류:
-생년월일의 경우 NUMBER 보다 CHAR(8) 타입이 좋다.
-첨부파일은 게시판 테이블에 넣기보다는 따로 빼야 한다. (파일명, 파일 확장자 식별 등)
-불리언 타입의 경우 CHAR(1) 로 Y / N 처리
-시퀀스 만들 때 조회수는 시퀀스가 필요 없음. (그냥 글을 SELECT 할때 업데이트 쳐줌 CNT++)