[오라클] 테이블명, 제약조건, 컬럼명 변경하기
본문 바로가기
IT. 컴퓨터

[오라클] 테이블명, 제약조건, 컬럼명 변경하기

by 솔기잇 2020. 5. 30.

## 테이블명, 제약조건, 컬럼명 변경하기 ##

 

구글 이미지

<< 테이블 생성 >>

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;


close