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++)