>>>> 제약조건(Constraint)의 종류 <<<<
-- 제약조건의 이름은 오라클 전체에서 고유해야 한다.
1. Primary Key(기본키, 대표식별자) 제약 [P]
-- 하나의 테이블당 오로지 1개만 생성할 수 있다.
-- 어떤 컬럼에 Primary Key(기본키) 제약을 주면 그 컬럼에는 자동적으로 NOT NULL 이 주어지면서 동시에
그 컬럼에는 중복된 값은 들어올 수 없고 오로지 고유한 값만 들어오게 되어진다.
-- 컬럼 1개를 가지고 생성된 Primary Key 를 Single Primary Key 라고 부르고,
-- 컬럼 2개 이상을 가지고 생성된 Primary Key 를 Composite(복합) Primary Key 라고 부른다.
2. Unique 제약 [U]
-- 하나의 테이블당 여러개를 생성할 수 있다.
-- 어떤 컬럼에 Unique 제약을 주면 그 컬럼에는 NULL 을 허용할 수 있으며, 그 컬럼에는 중복된 값은 들어올 수 없고
오로지 고유한 값만 들어오게 되어진다.
-- Unique Key 중에 후보키, 후보식별자가 되려면 해당 컬럼은 NOT NULL 이어야 한다.
3. Foreign Key(외래키) 제약 [R]
-- 하나의 테이블당 여러개를 생성할 수 있다.
-- Foreign Key(외래키) 제약에 의해 참조(Reference)받는 컬럼은 반드시 NOT NULL 이어야 하고,
중복된 값을 허락하지 않는 고유한 값만 가지는 컬럼이어야 한다.
4. Check 제약 [C]
-- 하나의 테이블당 여러개를 생성할 수 있다.
-- insert(입력) 또는 update(수정) 시 어떤 컬럼에 입력되거나 수정되는 데이터값을 아무거나 허락하는 것이 아니라
조건에 맞는 데이터값만 넣고자 할 경우에 사용되는 것이다.
5. NOT NULL 제약 [C]
-- 하나의 테이블당 여러개를 생성할 수 있다.
-- 특정 컬럼에 NOT NULL 제약을 주면 그 컬럼에는 반드시 데이터값을 주어야 한다는 말이다.
----- >>>> Primary Key(기본키, 대표식별자) 제약 [P] 및 Unique 제약 [U] 에 대해서 알아보기 <<<< -----
"회원" 이라는 테이블을 생성한다.
create table tbl_new_member
(member_id varchar2(20) -- 아이디 Primary Key 이기 때문에 자동적으로 not null
, passwd varchar2(20) not null -- 비밀번호
, name Nvarchar2(10) not null -- 성명
, email varchar2(50) not null -- 이메일
, mobile varchar2(11) -- 휴대폰
, constraint PK_tbl_new_member_member_id Primary Key(member_id) -- Single(단독) Primary Key
-- 참고: 오라클 11g 에서 객체명은 최대 글자수가 30글자 이다. 30글자를 넘으면 오류 발생
-- 오라클 18c 는 괜찮음
, constraint UQ_tbl_new_member_email unique(email)
, constraint UQ_tbl_new_member_mobile unique(mobile)
);
-- Table TBL_NEW_MEMBER이(가) 생성되었습니다.
desc tbl_new_member;
/*
이름 널? 유형
--------- -------- -------------
MEMBER_ID NOT NULL VARCHAR2(20)
PASSWD NOT NULL VARCHAR2(20)
NAME NOT NULL NVARCHAR2(10)
EMAIL NOT NULL VARCHAR2(50)
MOBILE VARCHAR2(11)
*/
insert into tbl_new_member(member_id, passwd, name, email, mobile)
values(null, 'qwer1234$', '이순신', 'leess@naver.com', null);
-- ORA-01400: NULL을 ("HR"."TBL_NEW_MEMBER"."MEMBER_ID") 안에 삽입할 수 없습니다
insert into tbl_new_member(member_id, passwd, name, email, mobile)
values('leess', 'qwer1234$', '이순신', 'leess@naver.com', null);
-- 1 행 이(가) 삽입되었습니다.
insert into tbl_new_member(member_id, passwd, name, email, mobile)
values('leess', 'qwer1234$', '이삼순', 'leess@naver.com', null);
-- ORA-00001: 무결성 제약 조건(HR.PK_TBL_NEW_MEMBER_MEMBER_ID)에 위배됩니다
insert into tbl_new_member(member_id, passwd, name, email, mobile)
values('leesamsun', 'qwer1234$', '이삼순', 'leess@naver.com', null);
-- ORA-00001: 무결성 제약 조건(HR.UQ_TBL_NEW_MEMBER_EMAIL)에 위배됩니다
insert into tbl_new_member(member_id, passwd, name, email, mobile)
values('leesamsun', 'qwer1234$', '이삼순', 'leess@daum.com', null);
-- 1 행 이(가) 삽입되었습니다.
commit;
select *
from tbl_new_member;
insert into tbl_new_member(member_id, passwd, name, email, mobile)
values('eomjh', 'qwer1234$', '엄정화', null, '01023456789');
-- ORA-01400: NULL을 ("HR"."TBL_NEW_MEMBER"."EMAIL") 안에 삽입할 수 없습니다
insert into tbl_new_member(member_id, passwd, name, email, mobile)
values('eomjh', 'qwer1234$', '엄정화', 'eomjh@gmail.com', '01023456789');
-- 1 행 이(가) 삽입되었습니다.
commit;
select *
from tbl_new_member;
insert into tbl_new_member(member_id, passwd, name, email, mobile)
values('kangkc', 'qwer1234$', '강감찬', 'kangkc@gmail.com', '01023456789');
-- ORA-00001: 무결성 제약 조건(HR.UQ_TBL_NEW_MEMBER_MOBILE)에 위배됩니다
insert into tbl_new_member(member_id, passwd, name, email, mobile)
values('kangkc', 'qwer1234$', '강감찬', 'kangkc@gmail.com', '01077778888');
-- 1 행 이(가) 삽입되었습니다.
insert into tbl_new_member(member_id, passwd, name, email, mobile)
values('junghwa', 'qwer1234$', '엄정화', 'junghwa@gmail.com', '01055559999');
-- 일부러 동명이인을 입력함
-- 1 행 이(가) 삽입되었습니다.
commit;
select *
from tbl_new_member;
------ ===== ***** Composite(복합) Primary Key 예제 ***** ===== ------
create table tbl_new_jumun -- '주문' 테이블
( member_id varchar2(20) not null -- 회원 아이디
, product_id varchar2(50) not null -- 제품 아이디
, jumun_date date default sysdate not null -- 주문일자
, jumun_qty number not null -- 주문량
, constraint PK_tbl_new_jumun primary key( member_id, product_id, jumun_date ) -- Composite(복합) Primary Key
);
-- Table TBL_NEW_JUMUN이(가) 생성되었습니다.
[실행]
insert into tbl_new_jumun(member_id, product_id, jumun_date, jumun_qty)
values('leess', '새우깡', default, 10);
insert into tbl_new_jumun(member_id, product_id, jumun_date, jumun_qty)
values('leess', '감자깡', default, 10);
insert into tbl_new_jumun(member_id, product_id, jumun_date, jumun_qty)
values('leess', '새우깡', default, 20);
commit;
select *
from tbl_new_jumun;
----- >>>> Foreign Key(외래키) 제약 [R] 에 대해서 알아보기 <<<< -----
create table tbl_new_board
( boardno number -- 게시글 글번호
, subject Nvarchar2(100) not null -- 글제목
, content Nvarchar2(2000) not null -- 글제목 -- clob: 4GB 까지 저장 가능
, registerday date default sysdate not null -- 작성일자
, fk_member_id varchar2(20) not null -- 작성자 아이디
, constraint PK_tbl_new_board_boardno primary key(boardno)
, constraint FK_tbl_new_board_fk_member_id Foreign key(fk_member_id) references tbl_new_member(member_id) -- Foreign key(= 참조키, 레퍼런스키)
-- ORA-02270: 이 열목록에 대해 일치하는 고유 또는 기본 키가 없습니다.
-- 참조를 받는 테이블의 컬럼은 반드시 not null 이면서 고유해야 한다. => Primary Key
-- cascade 옵션이 없는 Foreign key 이다.
);
-- Table TBL_NEW_BOARD이(가) 생성되었습니다.
insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
values ( 1, '첫번째 글', '안녕하세요 ~ 1빠입니다.', default, 'batman' );
-- ORA-02291: 무결성 제약조건(HR.FK_TBL_NEW_BOARD_NAME)이 위배되었습니다- 부모 키가 없습니다
insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
values ( 1, '첫번째 글', '안녕하세요 ~ 1빠입니다.', default, 'leess' );
-- 1 행 이(가) 삽입되었습니다.
insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
values ( 2, '두번째 글', '좋은하루', default, 'eomjh' );
-- 1 행 이(가) 삽입되었습니다.
insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
values ( 3, '세번째 글', '날씨 좋ㄷ ㅏ', default, 'leess' );
-- 1 행 이(가) 삽입되었습니다.
commit;
select *
from tbl_new_board;
/*
----------------------------------------------------------------
글번호 글제목 작성자명 작성일자
----------------------------------------------------------------
글번호 --> tbl_new_board.boardno
글제목 --> tbl_new_board.subject
작성자명 --> tbl_new_member.registerday
작성일자 --> tbl_new_board.name
*/
select B.boardno as 글번호
, B.subject as 글제목
, M.name as 작성자명
, to_char(B.registerday, 'yyyy-mm-dd hh24:mi:ss') as 작성일자
from tbl_new_board B join tbl_new_member M
ON B.fk_member_id = M.member_id
order by 1 desc;
------ ===== ***** !!!!! Foreign Key 생성시 on delete cascade 옵션을 주는 것 !!!!! ***** ===== ------
create table tbl_new_comment -- 게시글테이블에 대한 댓글 테이블 생성
( commentno number not null -- 댓글번호
, comment_content Nvarchar2(2000) not null -- 댓글내용
, registerday date default sysdate not null -- 댓글작성일자
, fk_boardno number not null -- 게시글의 원글번호
, fk_member_id varchar2(20) not null -- 댓글작성자아이디
, constraint PK_tbl_new_comment_commentno primary key(commentno)
, constraint FK_tbl_new_comment_fk_boardno foreign key(fk_boardno) references tbl_new_board(boardno)
-- , constraint FK_tbl_new_comment_fk_boardno foreign key(fk_boardno) references tbl_new_board(boardno) on delete cascade
, constraint FK_tbl_new_comment_fk_member_id foreign key(fk_member_id) references tbl_new_member(member_id)
);
-- Table TBL_NEW_COMMENT이(가) 생성되었습니다.
[실행]
select *
from tbl_new_comment;
insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
values(1, '댓글내용입니다.', default, 1, 'eomjh');
-- 1 행 이(가) 삽입되었습니다.
insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
values(2, '댓글내용2 입니다.', default, 1, 'eomjh');
-- 1 행 이(가) 삽입되었습니다.
insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
values(3, '이것은 댓글 입니다.', default, 5, 'leess');
-- ORA-02291: 무결성 제약조건(HR.FK_TBL_NEW_COMMENT_FK_BOARDNO)이 위배되었습니다- 부모 키가 없습니다
insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
values(3, '이것은 댓글 입니다.', default, 3, 'leess');
-- 1 행 이(가) 삽입되었습니다.
commit;
select *
from tbl_new_comment;
select *
from tbl_new_board;
-- 현재는 원게시글 1, 3번글에 대한 댓글이 있다.
-- 게시글(tbl_new_board) 테이블에서 특정글 삭제하기 --
delete tbl_new_board
where boardno = 2; -- 원게시글 2번글을 삭제한다.
-- 1 행 이(가) 삭제되었습니다.
delete tbl_new_board
where boardno = 1; -- 원게시글 1번글을 삭제한다.
-- ORA-02292: 무결성 제약조건(HR.FK_TBL_NEW_COMMENT_FK_BOARDNO)이 위배되었습니다- 자식 레코드가 발견되었습니다
rollback;
delete from tbl_new_comment
where fk_boardno = 1;
-- 2개 행 이(가) 삭제되었습니다.
delete tbl_new_board
where boardno = 1;
rollback;
------ ===== Foreign Key 생성시 on delete cascade 옵션을 주기 ===== ------
drop table tbl_new_comment purge;
-- Table TBL_NEW_COMMENT이(가) 삭제되었습니다.
create table tbl_new_comment -- 게시글테이블에 대한 댓글 테이블 생성
( commentno number not null -- 댓글번호
, comment_content Nvarchar2(2000) not null -- 댓글내용
, registerday date default sysdate not null -- 댓글작성일자
, fk_boardno number not null -- 게시글의 원글번호
, fk_member_id varchar2(20) not null -- 댓글작성자아이디
, constraint PK_tbl_new_comment_commentno primary key(commentno)
, constraint FK_tbl_new_comment_fk_boardno foreign key(fk_boardno) references tbl_new_board(boardno) on delete cascade
-- 부모 테이블인 tbl_new_board 테이블에 어떤 행을 삭제할 때 먼저 자식테이블인 tbl_new_comment 테이블에 자식 행(레코드)이 있다면
-- 먼저 자식테이블인 tbl_new_comment 테이블에서 자식 행을 삭제한다.
, constraint FK_tbl_new_comment_fk_member_id foreign key(fk_member_id) references tbl_new_member(member_id)
);
-- Table TBL_NEW_COMMENT이(가) 생성되었습니다.
select *
from tbl_new_comment;
insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
values(1, '댓글내용입니다.', default, 1, 'eomjh');
-- 1 행 이(가) 삽입되었습니다.
insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
values(2, '댓글내용2 입니다.', default, 1, 'eomjh');
-- 1 행 이(가) 삽입되었습니다.
insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
values(3, '이것은 댓글 입니다.', default, 5, 'leess');
-- ORA-02291: 무결성 제약조건(HR.FK_TBL_NEW_COMMENT_FK_BOARDNO)이 위배되었습니다- 부모 키가 없습니다
insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
values(3, '이것은 댓글 입니다.', default, 3, 'leess');
-- 1 행 이(가) 삽입되었습니다.
commit;
select *
from tbl_new_comment;
select *
from tbl_new_board;
delete from tbl_new_board
where boardno = 1;
-- 1 행 이(가) 삭제되었습니다.
-- fk_boardno 컬럼에 1번글이 있던 것이 자동적으로 삭제됨
rollback;
--------------------------------------------------------------------------------------------------
------ ===== ***** !!!!! Foreign Key 생성시 on delete set null 옵션을 주는 것 !!!!! ***** ===== ------
--------------------------------------------------------------------------------------------------
delete from tbl_new_member
where member_id = 'leess';
-- ORA-02292: 무결성 제약조건(HR.FK_TBL_NEW_BOARD_FK_MEMBER_ID)이 위배되었습니다- 자식 레코드가 발견되었습니다
select *
from tbl_new_board;
desc tbl_new_board;
alter table tbl_new_board
modify fk_member_id null;
-- fk_member_id 가 not null 에서 null 로 바뀜
update tbl_new_board set fk_member_id = null
where fk_member_id = 'leess';
-- 2개 행 이(가) 업데이트되었습니다.
delete from tbl_new_member
where member_id = 'leess';
-- ORA-02292: 무결성 제약조건(HR.FK_TBL_NEW_COMMENT_FK_MEMBER_ID)이 위배되었습니다- 자식 레코드가 발견되었습니다
select *
from tbl_new_comment;
update tbl_new_comment set fk_member_id = null
where fk_member_id = 'leess';
-- ORA-01407: NULL로 ("HR"."TBL_NEW_COMMENT"."FK_MEMBER_ID")을 업데이트할 수 없습니다
desc tbl_new_comment;
alter table tbl_new_comment
modify fk_member_id null;
-- Table TBL_NEW_COMMENT이(가) 변경되었습니다.
update tbl_new_comment set fk_member_id = null
where fk_member_id = 'leess';
-- 1 행 이(가) 업데이트되었습니다.
commit;
delete from tbl_new_member
where member_id = 'leess';
-- 1 행 이(가) 삭제되었습니다.
select *
from tbl_new_member;
select *
from tbl_new_board;
select *
from tbl_new_comment;
-- leess 회원이 탈퇴하면서 작성한 글과 댓글들의 fk_member_id 가 null 로 바뀜
-- Foreign Key 생성시 on delete set null 옵션을 주기 --
drop table tbl_new_comment purge;
drop table tbl_new_board purge;
-- 테이블을 drop 할 때도 자식테이블이 있는 경우 부모테이블을 drop 할 수가 없다.
-- 그러므로 부모테이블과 자식테이블 모두 삭제할 경우에는 먼저 자식테이블부터 drop 을 하고
-- 그 뒤에 부모테이블을 drop 해야 한다.
-- 테이블 생성시에는 부모테이블부터 만들고 그 다음에 자식테이블을 생성해야 한다.
create table tbl_new_board
( boardno number -- 게시글 글번호
, subject Nvarchar2(100) not null -- 글제목
, content Nvarchar2(2000) not null -- 글제목 -- clob: 4GB 까지 저장 가능
, registerday date default sysdate not null -- 작성일자
, fk_member_id varchar2(20) not null -- 작성자 아이디
, constraint PK_tbl_new_board_boardno primary key(boardno)
, constraint FK_tbl_new_board_fk_member_id Foreign key(fk_member_id) references tbl_new_member(member_id) on delete set null -- Foreign key(= 참조키, 레퍼런스키)
-- ORA-02270: 이 열목록에 대해 일치하는 고유 또는 기본 키가 없습니다.
-- 참조를 받는 테이블의 컬럼은 반드시 not null 이면서 고유해야 한다. => Primary Key
-- cascade 옵션이 없는 Foreign key 이다.
);
insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
values ( 1, '첫번째 글', '안녕하세요 ~ 1빠입니다.', default, 'leess' );
-- 1 행 이(가) 삽입되었습니다.
insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
values ( 2, '두번째 글', '좋은하루', default, 'eomjh' );
-- 1 행 이(가) 삽입되었습니다.
insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
values ( 3, '세번째 글', '날씨 좋ㄷ ㅏ', default, 'leess' );
-- 1 행 이(가) 삽입되었습니다.
commit;
select *
from tbl_new_board;
delete from tbl_new_member
where member_id = 'leess';
ORA-01407: NULL로 ("HR"."TBL_NEW_BOARD"."FK_MEMBER_ID")을 업데이트할 수 없습니다
create table tbl_new_board
( boardno number -- 게시글 글번호
, subject Nvarchar2(100) not null -- 글제목
, content Nvarchar2(2000) not null -- 글제목 -- clob: 4GB 까지 저장 가능
, registerday date default sysdate not null -- 작성일자
, fk_member_id varchar2(20) -- 작성자 아이디
, constraint PK_tbl_new_board_boardno primary key(boardno)
, constraint FK_tbl_new_board_fk_member_id Foreign key(fk_member_id) references tbl_new_member(member_id) on delete set null -- Foreign key(= 참조키, 레퍼런스키)
-- 부모테이블인 tbl_new_member 테이블에서 특정 행을 삭제할 때 자식테이블인 tbl_new_board 테이블에
-- 삭제하려는 부모테이블 tbl_new_member 의 행을 참조하고 있는 행이 있을 때 fk_member_id 컬럼의 값을 먼저 null 로 update 하고나서
-- 부모테이블인 tbl_new_member 테이블에서 특정 행을 삭제한다.
-- 그런데 이것을 하기 위한 전제조건은 fk_member_id 컬럼의 값은 null 을 허용해야 한다는 것이다.
);
insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
values ( 1, '첫번째 글', '안녕하세요 ~ 1빠입니다.', default, 'leess' );
-- 1 행 이(가) 삽입되었습니다.
insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
values ( 2, '두번째 글', '좋은하루', default, 'eomjh' );
-- 1 행 이(가) 삽입되었습니다.
insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
values ( 3, '세번째 글', '날씨 좋ㄷ ㅏ', default, 'leess' );
-- 1 행 이(가) 삽입되었습니다.
commit;
select *
from tbl_new_board;
delete from tbl_new_member
where member_id = 'leess';
-- 1 행 이(가) 삭제되었습니다.
rollback;
------------------------------- ***** 최종 ***** -------------------------------
drop table tbl_new_comment purge;
drop table tbl_new_board purge;
drop table tbl_new_member purge;
create table tbl_new_member
(member_id varchar2(20) -- 아이디 Primary Key 이기 때문에 자동적으로 not null
, passwd varchar2(20) not null -- 비밀번호
, name Nvarchar2(10) not null -- 성명
, email varchar2(50) not null -- 이메일
, mobile varchar2(11) -- 휴대폰
, status number(1) default 1 not null -- 회원의 탈퇴유무를 알려주는 용도 ( 1: 가입중, 0 : 탈퇴 )
, point number(4) default 100 not null -- 포인트
, constraint PK_tbl_new_member_member_id Primary Key(member_id) -- Single(단독) Primary Key
, constraint UQ_tbl_new_member_email unique(email)
, constraint UQ_tbl_new_member_mobile unique(mobile)
, constraint CK_tbl_new_member_status check( status in(0,1) )
, constraint CK_tbl_new_member_point check( point between 0 and 9000 )
);
-- Table TBL_NEW_MEMBER이(가) 생성되었습니다.
insert into tbl_new_member(member_id, passwd, name, email, mobile)
values('leess', 'qwer1234$', '이순신', 'leess@naver.com', null);
-- 1 행 이(가) 삽입되었습니다.
-- status 와 point 는 디폴트로 삽입
insert into tbl_new_member(member_id, passwd, name, email, mobile)
values('eomjh', 'qwer1234$', '엄정화', 'eomjh@gmail.com', '01023456789');
-- 1 행 이(가) 삽입되었습니다.
insert into tbl_new_member(member_id, passwd, name, email, mobile)
values('kangkc', 'qwer1234$', '강감찬', 'kangkc@gmail.com', '01077778888');
-- 1 행 이(가) 삽입되었습니다.
commit;
select *
from tbl_new_member;
update tbl_new_member set status = 5
where member_id = 'leess';
-- ORA-02290: 체크 제약조건(HR.CK_TBL_NEW_MEMBER_STATUS)이 위배되었습니다
update tbl_new_member set status = 0
where member_id = 'leess';
-- 1 행 이(가) 업데이트되었습니다.
update tbl_new_member set status = 1
where member_id = 'leess';
-- 1 행 이(가) 업데이트되었습니다.
update tbl_new_member set point = 9500
where member_id = 'leess';
-- ORA-02290: 체크 제약조건(HR.CK_TBL_NEW_MEMBER_POINT)이 위배되었습니다
update tbl_new_member set point = 300
where member_id = 'leess';
-- 1 행 이(가) 업데이트되었습니다.
select *
from tbl_new_member;
commit;
create table tbl_new_board
( boardno number -- 게시글 글번호
, subject Nvarchar2(100) not null -- 글제목
, content Nvarchar2(2000) not null -- 글내용
, registerday date default sysdate not null -- 작성일자
, fk_member_id varchar2(20) not null -- 작성자 아이디
, constraint PK_tbl_new_board_boardno primary key(boardno)
, constraint FK_tbl_new_board_fk_member_id Foreign key(fk_member_id) references tbl_new_member(member_id)
);
-- Table TBL_NEW_BOARD이(가) 생성되었습니다.
insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
values ( 1, '첫번째 글', '안녕하세요 ~ 1빠입니다.', default, 'leess' );
-- 1 행 이(가) 삽입되었습니다.
insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
values ( 2, '두번째 글', '좋은하루', default, 'eomjh' );
-- 1 행 이(가) 삽입되었습니다.
insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
values ( 3, '세번째 글', '날씨 좋ㄷ ㅏ', default, 'leess' );
-- 1 행 이(가) 삽입되었습니다.
commit;
select *
from tbl_new_board;
create table tbl_new_comment -- 게시글테이블에 대한 댓글 테이블 생성
( commentno number not null -- 댓글번호
, comment_content Nvarchar2(2000) not null -- 댓글내용
, registerday date default sysdate not null -- 댓글작성일자
, fk_boardno number not null -- 게시글의 원글번호
, fk_member_id varchar2(20) not null -- 댓글작성자아이디
, constraint PK_tbl_new_comment_commentno primary key(commentno)
, constraint FK_tbl_new_comment_fk_boardno foreign key(fk_boardno) references tbl_new_board(boardno) on delete cascade
, constraint FK_tbl_new_comment_fk_member_id foreign key(fk_member_id) references tbl_new_member(member_id)
);
-- Table TBL_NEW_COMMENT이(가) 생성되었습니다.
insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
values(1, '댓글내용입니다.', default, 1, 'eomjh');
-- 1 행 이(가) 삽입되었습니다.
insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
values(2, '댓글내용2 입니다.', default, 1, 'eomjh');
-- 1 행 이(가) 삽입되었습니다.
insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
values(3, '이것은 댓글 입니다.', default, 3, 'leess');
-- 1 행 이(가) 삽입되었습니다.
commit;
/*
----------------------------------------------------------------
글번호 글제목 작성자명 작성일자
----------------------------------------------------------------
3 세번째 글 [1] 이순신 22/07/15 11:20:22
2 두번째 글 엄정화 22/07/15 11:20:22
1 첫번째 글 [2] 이순신 22/07/15 11:20:22
*/
with
cmt as
( select fk_boardno, count(*) as cmtcnt
from tbl_new_comment
group by fk_boardno
)
select BRD.boardno as 글번호
, BRD.subject || case when CMT.cmtcnt is not null then ' [' || CMT.cmtcnt || ']' else null end as 글제목
, MBR.name as 작성자명
, to_char(BRD.registerday, 'yyyy-mm-dd hh24:mi:ss') as 작성일자
from tbl_new_board BRD left join cmt
on BRD.boardno = CMT.fk_boardno
join tbl_new_member MBR
on MBR.member_id = BRD.fk_member_id
order by 1 desc;
select *
from tbl_new_comment -- 댓글
where fk_boardno = 1;
delete from tbl_new_board -- 원게시글
where boardno = 1;
delete from tbl_new_member -- 원게시글
where member_id = 'leess';
-- ORA-02292: 무결성 제약조건(HR.FK_TBL_NEW_BOARD_FK_MEMBER_ID)이 위배되었습니다- 자식 레코드가 발견되었습니다
rollback;
update tbl_new_member set status = 0
where member_id = 'leess';
-- 1 행 이(가) 업데이트되었습니다.
select *
from tbl_new_member;
select case (select count(*)
from tbl_new_member
where status = 1 and member_id = 'leess' and passwd = 'qwer1234$' )
when 1 then '로그인성공'
else '로그인 실패'
end 로그인결과
from dual;
select *
from employees
order by employee_id;
update employees set manager_id = 9004
where employee_id = 101;
-- ORA-02291: 무결성 제약조건(HR.EMP_MANAGER_FK)이 위배되었습니다- 부모 키가 없습니다
update employees set manager_id = 102
where employee_id = 101;
rollback;
create table tbl_sawon
( sawon_no number(4) not null
, saname varchar2(40) not null
, manager_no number(4)
, constraint PK_tbl_sawon_sawon_no primary key(sawon_no)
, constraint FK_tbl_sawon_manager_no foreign key(manager_no) references tbl_sawon(sawon_no)
-- 참조받는 컬럼은 not null 이면서 primary key 여야 한다.
);
-- Table TBL_SAWON이(가) 생성되었습니다.
insert into tbl_sawon(sawon_no, saname, manager_no) values(101, '나사장', null);
-- 1 행 이(가) 삽입되었습니다.
insert into tbl_sawon(sawon_no, saname, manager_no) values(102, '김부장', 101);
-- 1 행 이(가) 삽입되었습니다.
insert into tbl_sawon(sawon_no, saname, manager_no) values(103, '이과장', 300);
-- ORA-02291: 무결성 제약조건(HR.FK_TBL_SAWON_MANAGER_NO)이 위배되었습니다- 부모 키가 없습니다
'SQL' 카테고리의 다른 글
| 제약조건 (0) | 2022.07.15 |
|---|---|
| NOT NULL 제약 (0) | 2022.07.15 |
| ****** PACKAGE(패키지) ****** (0) | 2022.07.14 |
| ---- ===== **** CURSOR ( 중요 ) **** ===== ----- (0) | 2022.07.14 |
| 배열처럼 사용되는 table 타입 변수 (0) | 2022.07.14 |