## 테이블명, 제약조건, 컬럼명 변경하기 ##
<< 테이블 생성 >>
CREATE TABLE TBL_PRODUCT
(PDCODE VARCHAR2(10)
,PDNAME VARCHAR2(10)
,DANGA NUMBER
,CONSTRAINT TBL_PRODUCT_PDCODE_PK
PRIMARY KEY(PDCODE)
);
<< 테이블 생성 >>
CREATE TABLE TBL_PANAME
(PDCODE VARCHAR2(10)
,PANDAY DATE DEFAULT SYSDATE
,PANSU NUMBER
,CONSTRAINT TBL_PANAME_PDCODE_FK
FOREIGN KEY(PDCODE)
REFERENCES TBL_PRODUCT(PDCODE)
ON DELETE CASCADE
);
*************************************************************
-- 테이블명 변경하기
RENAME TBL_PANAME TO TBL_PANMAE;
--제약조건의 이름 변경
ALTER TABLE TBL_PANMAE
RENAME CONSTRAINT TBL_PANAME_PDCODE_FK TO
TBL_PANMAE_PDCODE_FK;
-- 컬럼명 변경하기
ALTER TABLE TBL_PRODUCT
RENAME COLUMN DANGA TO PRICE;
*************************************************************
INSERT INTO TBL_PRODUCT VALUES
('SEK', '새우깡', 1000);
INSERT INTO TBL_PRODUCT VALUES
('KJK', '감자깡', 1500);
INSERT INTO TBL_PRODUCT VALUES
('YPR', '양파링', 2000);
INSERT INTO TBL_PANMAE(PDCODE,PANSU)
VALUES('SEK', 20);
INSERT INTO TBL_PANMAE(PDCODE,PANSU)
VALUES('KJK', 30);
INSERT INTO TBL_PANMAE(PDCODE,PANSU)
VALUES('SEK', 50);
INSERT INTO TBL_PANMAE(PDCODE,PANSU)
VALUES('SEK', 10);
INSERT INTO TBL_PANMAE(PDCODE,PANSU)
VALUES('SEK', 10);
--ORA-02291: 무결성 제약조건(NEWSCOTT.TBL_PANMAE_PDCODE_FK)이 위배되었습니다-
COMMIT;
*************************************************************
--조회
SELECT *
FROM TBL_PRODUCT;
SELECT *
FROM TBL_PANMAE;
--지우기
DELETE TBL_PRODUCT
WHERE PDCODE ='YPR';
*************************************************************
--지울 때 주의 사항
DELETE TBL_PRODUCT
WHERE PDCODE ='SWK';
-- 1:다 관계에서는 새우깡의 판매기록이 없으면 안되니까 안된다.
그래서 다른 방법으로 한다.
-- ON DELETE CASCADE 주게 되면 판매기록도 없어진다.
ROLLBACK;
--그래서 딜리트를 하지 않고 스테이터스를 만들어서 Y 라하면 판매되어진
-- 품목으로, N라 하면 판매되어지지 않은 품목으로 하면 된다.
-- 그런데 꼭 딜리트를 하고 싶은다면, 트리거를 취급하지 않는 테이블에
-- 옮기고 나서 지운다.
-- 그래서 컬럼을 만드는 것이다.
*****************************************************************************
## ,STATUS 제약조건 ##
1 : 다 관계의 테이블에서는 부모테이블에 존재하는 행은 Foreign Key 로 인해서 삭제가 불가하다.
(단,on delete cascade 옵션을 사용하지 않을 때)
update 로 그 효과를 (delete 하는 효과) 가지도록 한다.
즉, 특정 컬럼을 하나 생성해서 사용중인 행인지, 사용하지 않은 행인지 구분을 하도록 한다.
<< 테이블 생성 >>
CREATE TABLE TBL_PRODUCT2
(PDCODE VARCHAR2(10)
,PDNAME VARCHAR2(10)
,DANGA NUMBER
,STATUS NUMBER(1) DEFAULT 1 -- 1: 사용중 , 0: 사용불가
,CONSTRAINT TBL_PRODUCT2_PDCODE_PK
PRIMARY KEY(PDCODE)
,CONSTRAINT TBL_PRODUCT2_STATUS_CK
CHECK( STATUS IN (0,1) )
--STATUS = 0 OR STATUS = 1)
);
<< 테이블 생성 >>
CREATE TABLE TBL_PANMAE2
(PDCODE VARCHAR2(10)
,PANDAY DATE DEFAULT SYSDATE
,PANSU NUMBER
,CONSTRAINT TBL_PANMAE2_PDCODE_FK
FOREIGN KEY(PDCODE)
REFERENCES TBL_PRODUCT2(PDCODE)
);
*************************************************************
--삭제시 삭제불가
DROP TABLE TBL_PRODUCT2;
=>ORA-02449: 외래 키에 의해 참조되는 고유/기본 키가 테이블에 있습니다
--삭제시 삭제가능
DROP TABLE TBL_PANMAE2;
*************************************************************
INSERT INTO TBL_PRODUCT2(PDCODE,PDNAME,DANGA)
VALUES ('SWK', '새우깡', 1000);
INSERT INTO TBL_PRODUCT2(PDCODE,PDNAME,DANGA)
VALUES ('KJK', '감자깡', 1500);
INSERT INTO TBL_PRODUCT2(PDCODE,PDNAME,DANGA)
VALUES ('YPR', '양파링', 2000);
COMMIT;
INSERT INTO TBL_PANMAE2(PDCODE,PANSU)
VALUES('SWK', 20);
INSERT INTO TBL_PANMAE2(PDCODE,PANSU)
VALUES('KJK', 30);
INSERT INTO TBL_PANMAE2(PDCODE,PANSU)
VALUES('SWK', 50);
INSERT INTO TBL_PANMAE2(PDCODE,PANSU)
VALUES('SWK', 10);
INSERT INTO TBL_PANMAE2(PDCODE,PANSU)
VALUES('BBR', 15);
-- ORA-02291: 무결성 제약조건(NEWSCOTT.TBL_PANMAE2_PDCODE_FK)이
위배되었습니다- 부모 키가 없습니다
COMMIT;
*************************************************************
--조회
SELECT *
FROM TBL_PRODUCT2
WHERE STATUS = 1;
SELECT *
FROM TBL_PANMAE2;
*************************************************************
SELECT *
FROM TBL_PANMAE2
WHERE PDCODE IN
-- 제품테이블에서 취금하는 품목만 제품코드를 보고자 한다.
(SELECT PDCODE
FORM TBL_PRODUCT2
WHERE STATUS = 1)
--업데이트 (사용중인 제품만 업데이트를 이용하면 구지 지우지 않아도 된다.)
UPDATE TBL_PRODUCT2 SET STATUS = 1
WHERE PDCODE = 'SWK';
COMMIT;
'IT. 컴퓨터' 카테고리의 다른 글
[오라클] 괄호, AND, OR, NOT, =, !=,(^=, <>) (0) | 2020.06.04 |
---|---|
[오라클] 트리거로 백업 (0) | 2020.06.02 |
[오라클] DB모델링 , 1:1관계 , TRIGGER (0) | 2020.05.28 |
[오라클] 정규화란? (0) | 2020.05.21 |
[오라클] 부모테이블과 자식테이블 (0) | 2020.05.07 |