본문 바로가기
ICIA 수업일지

2021.07.05 수업일지

by 주성씨 2021. 7. 10.

- 07.02 문제 REVIEW

- 문제 6) 사원 이름, 부서 번호와 해당 사원과
- 같은 부서에 근무하는 사원이름, 부서 번호 출력(셀프 조인)
- 셀프 조인 사용

나)

SELECT E.ENAME 자신, E.DEPTNO 부서번호, C.ENAME 동료, C.DEPTNO 부서번호
FROM EMP C JOIN EMP E
ON E.DEPTNO = C.DEPTNO
WHERE E.ENAME!=C.ENAME;

 

선생님)

SELECT E.ENAME 자신, E.DEPTNO 부서번호, C.ENAME 동료, C.DEPTNO 부서번호
FROM EMP E JOIN EMP C
ON E.DEPTNO = C.DEPTNO
WHERE E.ENAME!=C.ENAME
ORDER BY E.ENAME;

 

- SELECT 문 순서

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

 

- 서브(SUB) 쿼리(QUERY) : 메인 쿼리 내부에 포함된 먼저 실행되는 쿼리문

- SELECT, FROM, WHERE, HAVING절 서브 쿼리가 삽입된다.

- Q. JONES의 근무 부서명을 검색하여 출력하고 싶다면

SELECT DEPTNO FROM EMP
WHERE ENAME='JONES';

- 위 문제를 이용하여

SELECT DNAME FROM DEPT
WHERE DEPTNO=20;

- 위 두개의 쿼리를 합치면

SELECT DNAME FROM DEPT
WHERE DEPTNO=(SELECT DEPTNO FROM EMP
WHERE ENAME='JONES');

ㄴ 조인을 이용해도 되지만 위와 같이 서브 쿼리를 이용해도 된다.
서브 쿼리를 먼저 수행하고 그 값을 메인쿼리에 입력하여 출력된다.

 

Q. JONES보다 급여를 많이 받는 사원의 이름, 급여 출력
1. JONES의 급여를 먼저 알아낸다.

SELECT SAL FROM EMP
WHERE ENAME='JONES';

2. JONES의 급여보다 많이 받는 사원을 알아낸다.

SELECT ENAME, SAL FROM EMP
WHERE SAL>2975;

3. 위 메인쿼리와 서브 쿼리를 합치면

SELECT ENAME, SAL FROM EMP
WHERE SAL>(SELECT SAL FROM EMP
WHERE ENAME='JONES');

 

- FROM절에 들어가는 서브쿼리 ***

Q. 10번 부서에 근무하는 사원 이름, 부서명

- 조인문은 각자 해보기

SELECT E.ENAME, D.DEPTNO
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
WHERE D.DEPTNO=10;

ㄴㄷ

- 서브쿼리문

SELECT E.ENAME, D.DEPTNO
FROM EMP E JOIN (SELECT DEPTNO, DNAME
                FROM DEPT
                WHERE DEPTNO=10) D -- 인라인 뷰
ON E.DEPTNO=D.DEPTNO;
※ 인라인 뷰(INLINE VIEW)
 인라인 뷰는 FROM 절에 사용되는 서브 쿼리를 의미한다. SQL 문 내부에 뷰를 정의하여 사용한다. 일시적으로 사용된다. 인라인 뷰를 통해 새로운 테이블을 일시적으로 생성하고, 인라인 뷰에 대해서 ROWNUM을 이용하여 쿼리문을 실행하면 원하는 결과를 검색이 가능하다.(인라인 뷰에 의해 ROWNUM이 1부터 새로부여됨)
SELECT *
FROM EMP; -- 물리적인 테이블만 썼었지만 논리적 테이블도 가능함을 알았다.

SELECT *
FROM (SELECT ENAME, SAL FROM EMP); -- 논리적테이블로 이름과 급여만

SELECT *
FROM (SELECT ENAME, SAL FROM EMP
    WHERE SAL>=3000) E; -- 조건절도 가능하게 된다.
※ VIEW? 관계 DB의 DB언어 SQL에서 하나 이상의 테이블 또는 다른 뷰에서 원하는 데이터를 선택하여, 그들을 사용자 정의하여 나타낸 것이다. 뷰를 사용하면 여러 테이블이나 뷰를 하나의 테이블인것처럼 볼 수 있다.

 

 

-- 서브 쿼리에서 그룹 함수 사용

Q. 급여 평균

SELECT AVG(SAL)
FROM EMP;

 

Q. 평균보다 많이 받는 사원 출력

SELECT ENAME, SAL
FROM EMP
WHERE SAL>=(SELECT AVG(SAL)
            FROM EMP);

 

Q. 급여를 내림차순으로 정렬

SELECT ENAME, SAL
FROM EMP
WHERE SAL>=(SELECT AVG(SAL)
            FROM EMP)
ORDER BY SAL DESC;

 

Q. 직급별로 직무와 최대급여를 출력하되, 최대급여가 SALESMAN의 최대급여보다 큰 그룹만 출력

1. SALESMAN의 최대급여

SELECT MAX(SAL)
FROM (SELECT SAL FROM EMP
        WHERE JOB='SALESMAN');

 

2. 직무별로 직무와 최대급여 출력

SELECT JOB, MAX(SAL)
FROM EMP
GROUP BY JOB
HAVING MAX(SAL)>(SELECT MAX(SAL)
FROM EMP WHERE JOB='SALESMAN');

ㄴ HAVING은 그룹화 후 조건

 

Q. 부서 번호 10번인 사 원 중에서 최대 급여를 받는 사원과 동일한 급여를 받는 사원번호, 사원명

SELECT EMPNO, ENAME
FROM EMP
WHERE SAL = (SELECT MAX(SAL) FROM EMP
            WHERE DEPTNO =10);

단일행 서브 쿼리, 서브 쿼리의 결과가 한개인 경우 비교되는 값도 하나이어야 한다.

 

-- 다중행 서브쿼리 : 서브쿼리의 결과가 여러 로우 검색

- 다중행 서브 쿼리에서 같냐 틀리냐를 비교하기 위해서는 IN()을 사용해야 한다.
- 값을 예측할 수 없을 때도 IN()을 사용해야 한다.
- IN()은 값이 여러 개인 경우 OR을 하나인 경우에는 =라는 의미를 내포한다.

SELECT ENAME, HIREDATE, DEPTNO
FROM EMP
WHERE DEPTNO = (SELECT DEPTNO FROM EMP
                WHERE ENAME = 'BLAKE');

ㄴ IN() 적용

SELECT ENAME, HIREDATE, DEPTNO
FROM EMP
WHERE DEPTNO IN (SELECT DEPTNO FROM EMP
                WHERE ENAME = 'BLAKE');

 

- 서브 쿼리 결과가 여러 개인 경우 1

SELECT ENAME, HIREDATE, DEPTNO
FROM EMP
WHERE DEPTNO IN (SELECT DEPTNO FROM EMP
                WHERE JOB = 'CLERK');

 

- 서브쿼리 결과가 여러개인 경우 2

SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO IN (SELECT DEPTNO FROM EMP
                WHERE SAL>=3000);

ㄴ 서브 조건은 급여가 3000이었지만 메인 쿼리는 급여가 3000 이하인 사원도 출력된다. 서브 쿼리의 값이 10, 20이었기 때문에 급여 3000이상이라는 조건이 사라졌기 때문이다.
ㄴ 서브쿼리를 제대로 이용하기 위해서는 서브쿼리를 통해서 나오는 데이터를 잘 봐야한다.

 

- 서브쿼리 결과가 여러 개인 경우 3
- ALL : 모든 결괏값이 일치하는 참, 중복조건

SELECT ENAME, SAL FROM EMP
WHERE SAL > ALL (SELECT SAL FROM EMP
            WHERE DEPTNO = 30);

ㄴ 서브 쿼리 결과를 모두 다 만족하는 메인 쿼리의 값을 구하고 싶다면 ALL을 이용하면 된다.
ㄴ 예를 들어 부서 번호가 30이면서 20인 그런 값은 존재하지 않지만 급여가 1600 이상이면서 1200이상인 이런 데이터는 존재한다.
ㄴ 값의 결과를 보면 부서번호 30의 급여 최댓값이 1600이므로 결과적으로 1600 초과하는 급여를 나타내는 것과 다를 바 없다.

SELECT ENAME, SAL FROM EMP
WHERE SAL > (SELECT MAX(SAL) FROM EMP
            WHERE DEPTNO = 30);

 

- EXISTS : 서브 쿼리의 결과 레코드(값)가 하나라도 존재하면 참

SELECT ENAME, SAL FROM EMP
WHERE NOT EXISTS(SELECT * FROM EMP WHERE SAL>6000);
※ 논리 데이터 모델의 물리 데이터 모델 변화

- 테이블
A) 데이터를 정의하는 DB의 가장 기본적인 오브젝트(객체)

B) 컬럼(행, COLUMN), 로우(열, ROW)로 구성

C) 컬럼에는 지정된 유형에 따라 데이터가 저장된다.

D) 테이블 구성요소
 1. ROW 로우, 열 : 튜플, 인스턴스, 어커런스
 2. COLUMN 컬럼, 행 : 각 속성 항목에 대한 값을 저장
 3. PRIMARY KEY : 후보키에서 선택한 MAIN KEY, 한 릴레이션(테이블)에서 특정 튜플(ROW)을 유일하게 구별할 수 있는 속성
 4. FOREIGN KEY : 다른 릴레이션의 기본키를 참조하는 속성 또는 속성들의 집합, 한 릴레이션에 속한 속성 A와 참조 릴레이션의 기본키인 B가 동일한 도메인 상에서 정의되었을 때, 속성 A를 외래키라함

 

- 반드시 서브 쿼리를 사용해야 하는 경우 **

※ SELECT 문 순서
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

Q. 급여를 많이 받는 사원 순으로 랭킹(순위)을 붙여 검색

SELECT ROWNUM, EMPNO, ENAME, SAL FROM EMP
ORDER BY SAL DESC;
8	7839	KING	5000
11	7902	FORD	3000
4	7566	JONES	2975
6	7698	BLAKE	2850
7	7782	CLARK	2450
2	7499	ALLEN	1600
9	7844	TURNER	1500
12	7934	MILLER	1300
5	7654	MARTIN	1250
3	7521	WARD	1250
10	7900	JAMES	950
1	7369	SMITH	800

ㄴ 순위가 엉망진창이 된다.

 

SELECT ROWNUM RANK, EMPNO, ENAME, SAL
FROM (SELECT * FROM EMP ORDER BY SAL DESC);
1	7839	KING	5000
2	7902	FORD	3000
3	7566	JONES	2975
4	7698	BLAKE	2850
5	7782	CLARK	2450
6	7499	ALLEN	1600
7	7844	TURNER	1500
8	7934	MILLER	1300
9	7654	MARTIN	1250
10	7521	WARD	1250
11	7900	JAMES	950
12	7369	SMITH	800

ㄴ 순위가 이쁘게 정렬되었다.
ㄴ FROM 절에서 급여별로 정렬 후 SELECT 문에서 순위와 필요한 칼럼만 검색해서 출력하게 된다.
ㄴ 이와 같이 서브 쿼리를 이용해서 SELECT문 순서를 바꿀 필요가 있을 때 반드시 이용해야 한다.

SELECT ROWNUM RANK, EMPNO, ENAME, SAL
FROM (SELECT * FROM EMP ORDER BY SAL DESC)
WHERE ROWNUM BETWEEN 6 AND 10; --나오지 않는다.

ㄴ ROWNUM이 1번부터 검색할뿐더러 알리어스 RANK도 거의 맨 마지막에 적용되므로 출력되지 않는다.

 

SELECT ROWNUM RANK, EMPNO, ENAME, SAL
FROM (SELECT * FROM EMP ORDER BY SAL DESC);

Q. 위 문장을 이용해서 6~10위만 검색할 수 있도록 서브 쿼리 작성

SELECT *
FROM (SELECT ROWNUM RANK, EMPNO, ENAME, SAL
      FROM (SELECT * FROM EMP ORDER BY SAL DESC)
      )
WHERE RANK BETWEEN 6 AND 10;
6	7499	ALLEN	1600
7	7844	TURNER	1500
8	7934	MILLER	1300
9	7654	MARTIN	1250
10	7521	WARD	1250

ㄴ ROWNUM은 무조건 상위 1부터 N까지 검색하도록 하기 때문에 해당 메인 쿼리에 RANK를 넣으면 안 된다.
ㄴ ROWNUM의 알리어스가 이미 임시 테이블로 만들어진 상태이니 RANK는 테이블 칼럼 명이라고 할 수 있다.

 

- DML(Data Manipulation Language) ; 데이터 조작이

- INSERT(삽입), UPDATE(수정), DELETE(삭제)

CREATE TABLE EMP01 -- EMP01이라는 물리적 테이블을 만들겠다.
AS SELECT * FROM EMP; -- EMP라는 논리적 테이블을 복사해서

DESC EMP01; -- 기본키가 복사가 안된다.

ㄴ 참고 및 연습용
ㄴ 이렇게 사용해서는 안된다.

1. 칼럼추가 : ALTER (테이블의 구조 변경)

ALTER TABLE EMP01 -- 테이블의 구조를 변경할때 ALTER
ADD EMAIL NVARCHAR2(20); -- 가변으로 영문 한글등을 20자리까지 입력가능

추가 ADD

 

2. 컬럼 변경

ALTER TABLE EMP01
MODIFY EMAIL NVARCHAR2(40); -- 자리수가 모자를때 확장가능

MODIFY를 이용해서 자릿수 변경

 

3.  칼럼 삭제

ALTER TABLE EMP01
DROP COLUMN EMAIL;

ㄴ DROP COLUMN '칼럼명' -> 컬러 삭제 가능

 

4. 칼럼 이름 변경

ALTER TABLE EMP01 RENAME COLUMN SAL TO SAL12;

ㄴ 칼럼명 SAL을 SAL12로 변경 RENAME을 이용

 

5.  테이블 이름 변경

RENAME EMP01 TO EMP1;

확인)

DESC EMP1;

 

6. 테이블 삭제

DROP TABLE EMP1;

 

- INSERT 연습용 테이블 생성

CREATE TABLE DEPT1
AS SELECT * FROM DEPT;
SELECT * FROM DEPT1;
INSERT INTO DEPT1 VALUES (50, '영업부', '서울');

-- 권장하는 포맷은 아님
-- DESC 문을 통해서 칼럼의 구조를 파악하고 입력해야 하지만
-- 순서가 많은 경우 실수를 하게 된다.

INSERT INTO DEPT1(DNAME, LOC, DEPTNO)
VALUES ('총무부', '서울', 60);

ㄴ 위와 같이 개별 지정하여 입력하는 게 실수를 방지할 수 있다.

 

- UPDATE을 이용한 데이터 수정

UPDATE DEPT1 SET LOC = '인천';
10	ACCOUNTING	인천
20	RESEARCH	인천
30	SALES	인천
40	OPERATIONS	인천
50	영업부	인천
60	총무부	인천
70	인사부	인천

ㄴ 이와 같이 실수했을 때 ROLLBACK을 이용하면 된다.

ROLLBACK;
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	CHICAGO
40	OPERATIONS	BOSTON
50	영업부	서울
60	총무부	서울
70	인사부	인천

ㄴ 초기화되었다.

 

+ 특정 행의 LOC을 변경하고 싶다면?

UPDATE DEPT1 SET LOC = '부산'
WHERE DEPTNO = 70;
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	CHICAGO
40	OPERATIONS	BOSTON
50	영업부	서울
60	총무부	서울
70	인사부	부산

 

+ 어떤 작업에 COMMIT을 해야 할까?
DML 작업에 대해서 COMMIT을 해야 한다. DDL, DCL의 경우는 바로바로 하드디스크에 저장되지만 DML은 바로 적용되지 않는다. TRANSITION 때문에 메모리에 저장하고 승인 시에 하드디스크에 저장한다.

 

INSERT INTO DEPT1(DEPTNO, DNAME, LOC) VALUES(80,'개발부','인천');
CREATE TABLE TEST(
ID NVARCHAR2(10)
);

ㄴ 위의 경우에 CREATE(DDL)은 자동으로 COMMIT 되기 때문에 ROLLBACK 되지 않는다.

DROP TABLE TEST;

ㄴ 자동 COMMIT을 테스트했으니 TABLE TEST는 삭제하자.

 

- 값을 아직 안 넣을 때의 방법

INSERT INTO DEPT1(DEPTNO, DNAME, LOC) VALUES(90,'개발3팀');

-- 테이블 칼럼은 세 개를 지정하였으면서 값은 두 개를 입력하면 오류가 발생한다.
-- 아직 주소를 못 받은 경우는 어떻게 해야 할까?
-- NULL을 넣는다.

INSERT INTO DEPT1(DEPTNO, DNAME, LOC) VALUES(90,'개발3팀',NULL);

-- NULL을 넣어도 좋지만 '' 도 가능하다.

INSERT INTO DEPT1(DEPTNO, DNAME, LOC) VALUES(91,'개발4팀','');

-- 테이블 칼럼의 순서를 정확히 알고 있으면 쿼리에서 생략이 가능하다.

INSERT INTO DEPT1 VALUES(92,'개발5팀','');

 

- 주소를 안 넣은 경우에 넣고 싶다면

UPDATE DEPT1 SET LOC = '학익동'
WHERE DNAME LIKE '%팀';

 

- 주소와 팀명을 변경하고 싶다면

UPDATE DEPT1 SET LOC = '구월동', DNAME='개발6팀'
WHERE DNAME ='개발3팀';

 

- 데이터 삭제 : DELETE

COMMIT과 ROLLBACK을 잘 파악하도록 하자.

 

Q. 서브 쿼리를 이용해 20번 부서의 부서명과 위치를 40번 부서와 동일하게 적용하기

UPDATE DEPT1 SET(DNAME, LOC) = (SELECT DNAME, LOC FROM DEPT1 WHERE DEPTNO=40)
WHERE DEPTNO = 20;

 

- TRANSACTION (TX) ;  쪼갤 수 없는 논리적인 작업 단위

 예를 들어 이체 TX는 A계좌에서 B계좌로 돈을 넣은다고 한다면 'UPDATE A계좌 감소, UPDATE B계좌 증가' 의 일련의 작업에서 더이상 나눌 작업이 없는 경우를 TX라고 할 수 있다.

이체 TX : 1.UPDATE A계좌 감소 성공 2.UPDATE B계좌 증가 성공 --> TX성공 --> COMMIT
이체 TX : 1.UPDATE A계좌 감소 성동 2.UPDATE B계좌 증가 실패 --> TX실패 --> ROLLBACK

 위와 같은 일련의 과정에서 TX가 하나라도 실패하게 된다면 되돌릴 필요가 있기 때문에 DDL은 자동 COMMIT이 되지 않는다. ALL OR NOTHING 이다.

 

- 데이터 일관성과 LOCK(잠금)

오라클을 두개 열어 A계정 B계정이라는 가칭을 이용해서 데이터 일관성을 파악해보자

1. 본

CREATE TABLE EMP1
AS SELECT * FROM EMP;

SELECT * FROM EMP WHERE EMPNO = 7369;

ㄴ EMP1이라는 EMP COPY본을 만들고
ㄴ 7369의 사번을 갖는 사원을 검색해보자.

2. 섭

DELETE FROM EMP1 WHERE EMPNO = 7369;

3. 본

UPDATE EMP1 SET SAL =200 WHERE EMPNO=7369;

ㄴ 이와 같이 섭에서 임시 삭제가 메모리상태에만 저장되어 있기 때문에 작업이 완료가 되지 않고 섭의 COMMIT을 대기하고 있는 것이다. 이와 같이 DB의 일관성이 유지되어야 데이터 보존에 문제가 발생하는걸 예방할 수 있다.

ㄴ 섭에서 COMMIT을 하거나 ROLLBACK을 해야한다.

 

4. 섭

ROLLBACK;

 

5. 본

섭에서 롤백되어 작업이 완료된 것이다.

 

- DEADLOCK(교착 상태)

1. 본

UPDATE EMP1 SET SAL=100 WHERE ENAME ='SMITH';

2. 섭

UPDATE EMP1 SET SAL = 20 WHERE ENAME ='SMITH';

ㄴ 동일한 작업에 대해서 COMMIT이나 ROLLBACK이 안되었기 때문에 섭의 마지막 쿼리에서 딜레이가 발생하게 된다.

3. 본

COMMIT;

ㄴ DEADLOCK 상태가 해소되었다.
ㄴ 값은 마지막 쿼리의 값이 입력된다. 여기서는 20이 입력되게 된다.

 

- 무결성 제약조건 *****

※ 무결성
1. 데이터베이스에 저장된 값들이 정확하고 일관성 있는 데이터임을 나타내는 의미
2. 데이터베이스는 무결성이 보장되도록 여러 개체에 규정을 부여하여 운영한다.
3. 즉, 필요없는 데이터는 걸러내고 필요한 데이터만 남아있는 상태를 말한다.
4. 무결성을 유지하는 것은 DBMS의 중요한 기능이며, 주로 데이터에 적용되는 연산에 제한을 두어 데이터의 무결성을 유지한다.

 

1. PRIMARY KEY(기본키) : 하나의 특정 레코드를 식별하기 위한 제약조건

- NOT NULL 특성을 가진다. 무조건 입력되어야 한다.
- UNIQUE 중복을 허용하지 않는다.
- EX. 사번, 전화번호, 주민번호, 등록번호, UID 등...

2. FOREIGN KEY(외래키) : 외래키는 기본키를 참조한다.

- 외래값은 NULL 값이거나 참조 릴레이션의 기본키 값과 동일해야한다.
- 릴레이션은 참조할 수 없는 외래키 값을 가질 수 없다.
- 외래키와 참조할려는 테이블의 기본키는 도메인과 속성 개수와 같아야한다.

3. NOT NULL : 컬럼값으로 NULL을 허용하지 않는다.
4. UNIQUE : 컬럼값으로 중복을 허용하지 않는다.
5. CHECK :  성별컬럼('남', '여') SAL(1000 ~ 5000) 등의 조건 많이 사용 X

- 이중검증은 하지 않기 떄문이다. 자바에서 충분히 검증이 가능하다.

6. DEFAULT : 제약조건은 아님, 컬럼의 기본값 설정

 

- 제약조건을 가지는 테이블 생성 ****

CREATE TABLE DEPT2(
    DEPTNO NUMBER(2), -- 자리수를 지정하지 않으면 자리수 상관없이 정수, 실수 가능하다.

ㄴ 실수를 받고 싶지 않다면

CREATE TABLE DEPT2(
    DEPTNO NUMBER(2,0),

ㄴ 2자리 이내의 정수

CREATE TABLE DEPT2(
    DEPTNO NUMBER(2,0),
    DNAME NVARCHAR2(10),

ㄴ 부서 이름은 10자리 문자열로 받겠다.

CREATE TABLE DEPT2(
    DEPTNO NUMBER(2,0),
    DNAME NVARCHAR2(10),
    LOC NVARCHAR2(10)
);

ㄴ 부서 위치도 10자리 문자열로 받겠다.

CREATE TABLE DEPT2(
    DEPTNO NUMBER(2,0) PRIMARY KEY,
    DNAME NVARCHAR2(10),
    LOC NVARCHAR2(10)
);

ㄴ 해당 테이블의 고유값인 DEPTNO을 PK로 지정하겠다.

Table DEPT2이(가) 생성되었습니다.
DESC DEPT2;

ㄴ 확인해보자.

이름     널?       유형            
------ -------- ------------- 
DEPTNO NOT NULL NUMBER(2)     
DNAME           NVARCHAR2(10) 
LOC             NVARCHAR2(10)

ㄴ DEPTNO은 NOT NULL, UNIQUE 값이어야 한다.

- 값 삽입

INSERT INTO DEPT2 VALUES (1, '총무부','서울');
INSERT INTO DEPT2 VALUES (2, '영업부','서울');
INSERT INTO DEPT2 VALUES (2, '개발부','인천');

ㄴ 만약 위에 쿼리처럼 중복 조건을 넣게 된다면?

명령의 1,235 행에서 시작하는 중 오류 발생 -
INSERT INTO DEPT2 VALUES (2, '영업부','서울')
오류 보고 -
ORA-00001: unique constraint (ICIA.SYS_C007010) violated

ㄴ 만약 위에 쿼리를 중복 조건을 지우고 싶다면

SELECT * FROM USER_CONSTRAINTS;

ㄴ 제약조건을 확인

ALTER TABLE DEPT2
DROP CONSTRAINTS SYS_C007010;

ㄴ 지우고 싶은 해당 테이블의 제약조건을 삭제
ㄴ 만약에 제약조건의 이름이 위의 SYS_C007010처럼 복잡한게 싫다면

CREATE TABLE DEPT2(
    DEPTNO NUMBER(2,0),
    DNAME NVARCHAR2(10),
    LOC NVARCHAR2(10),
    -- 테이블단에 제약조건 설정 / 이름은 가독성 있게
    CONSTRAINTS PK_DEPT2_DEPTNO PRIMARY KEY(DEPTNO)
);

제약조건은 테이블단에 넣는걸 권장한다.
ㄴ 그러나 이미 만들어져 있는 테이블은 안된다.
ㄴ 일단 삭제하고 다시 생성해보자.

ALTER TABLE DEPT2
DROP CONSTRAINTS PK_DEPT2_DEPTNO;

ㄴ 제약조건을 삭제(DROP) 할 수 있다면 추가(ADD)도 가능하다.

ALTER TABLE DEPT2
ADD CONSTRAINTS PK_DEPT2_DEPTNO PRIMARY KEY(DEPTNO);

 

'ICIA 수업일지' 카테고리의 다른 글

2021.07.07 수업일지  (0) 2021.07.10
2021.07.06 수업일지  (0) 2021.07.10
2021.07.02 수업일지  (0) 2021.07.03
2021.07.01 수업일지  (0) 2021.07.03
2021.06.30 수업일지  (0) 2021.07.03