2024. 10. 23. 15:49ㆍoracle
/*
* DDL (DATA DEFINITION LANGUAGE) : 데이터 정의 언어
구조자체를 정의하는 언어로 주로 DB관리자, 설계자 사용함
DDL : CREATE, ALTER, DROP
오라클에서 제공하는 객체(OBJECT)를
새롭게 만들고(CREATE), 구조를 변경하고(ALTER), 구조자체를 삭제하는 (DROP)하는 명령문
오라클에서의 객체(구조): 사용자(USER), 테이블(TABLE), 뷰(VIEW), 시퀀스(SEQUENCE), ...
인덱스(INDEX), 패키지(PACKAGE), 트리거(TRIGGER),
포르시저(PROCEDURE), 함수(FUNCTION), 동의어(SYNONYM)...
DML: SELECT(DQL) / INSERT, UPDATE, DELETE
*/
/*
< CREATE TABLE >
테이블이란?: 행(ROW), 열(COLUMN)로 구성되는 가장 기본적인 데이터베이스 객체
모든 데이터를 테이블을 통해서 저장함(데이터를 보관하고자 한다면 반드시 테이블을 만들어야함)
[ 표현법 ]
CREATE TABLE TB_테이블명 (
컬럼명 자료형,
컬럼명 자료형,
컬럼명 자료형,
...
);
< 자료형 >
- 문자(CHAR(크기) / VARCHAR2(크기)) : 크기는 BYTE단위
숫자, 영문자, 특수문자 → 1글자당 1BYTE
한글, 일본어, 중국어 → 1글자당 3BYTE
- CHAR(바이트수): 최대 2000BYTE까지 지정 가능
고정길이(아무리 작은 값이 들어와도 공백으로 채워서 처음 할당한 크기 유지)
주로 들어올 값의 글자수가 정해져 있을 경우
ex) 성별 남/여, M/F
- VARCHAR2(크기): VAR는 '가변'을 의미, 2는 '2배'를 의미
최대 4000BYTE까지 지정가능
가변길이(적은 값이 들어오면 담긴값에 맞추처서 크기가 줄어듦) → CLOB, BLOB
- 숫자 (NUMBER): 정수 / 실수 상관없이 NUMBER
- 날짜 (DATE): 년 월 시 분 초
*/
--> 회원의 정보 (아이디, 비밀번호, 이름, 회원가입일)을 담기위한 테이블 생성하기
CREATE TABLE TB_USER(
USER_ID VARCHAR2(15),
USER_PWD VARCHAR(20),
USER_NAME VARCHAR2(30),
CREATE_DATE DATE
);
SELECT * FROM TB_USER;
/*
컬럼에 주석달기 == 설명다는방법
[ 표현법 ]
COMMENT ON COLUMN 테이블명.컬럼명 IS '달고싶은설명'
*/
COMMENT ON COLUMN TB_USER.USER_ID IS '회원아이디';
COMMENT ON COLUMN TB_USER.USER_PWD IS '회원비밀번호';
COMMENT ON COLUMN TB_USER.USER_NAME IS '회원이름';
COMMENT ON COLUMN TB_USER.CREATE_DATE IS '회원가입일';
SELECT * FROM USER_TABLES;
-- 현재 이 계정이 가지고 있는 테이블들의 전반적인 구조를 확인할 수 있는 데티어 딕셔너리(사전)
SELECT * FROM USER_TAB_COLUMNS;
-- 현재 이 계정이 가지고 있는 테이블들의 모든 컬럼의 정보를 조회할 수 있는 데이터 딕셔너리
-- 데이터 딕셔너리: 객체들의 정보를 저장하고 있는 시스템 테이블
-- 데이터를 추가할 수 있는 구문 : INSERT → 한 행 단위로 추가, 값의 순서 중요
-- INSERT INTO 테이블명 VALUES(1번컬럼 값, 2번컬럼 값, 3번컬럼값..)
SELECT * FROM USER_TABLES;
INSERT INTO TB_USER VALUES('admin','1234','관리자','2024/08/01');
INSERT INTO TB_USER VALUES('test','1234','테스트','2024/09/09');
INSERT INTO TB_USER VALUES('USER','1234','홍길동',SYSDATE);
--------------------------------------------------------------------------------
INSERT INTO TB_USER VALUES('NULL', 'NULL', 'NULL', SYSDATE); --ID / PW자리에 null값이 존재할 수 없음
SELECT * FROM TB_USER_NOT_NULL;
-- NULL값이나 중복된 아이디값은 유효하지 않은 값들
-- 유효한 데이터값을 유지하기 위해서는 제약조건을 걸어줘야함
--------------------------------------------------------------------------------
/*
< 제약조건 CONSTRAINT >
- 테이블에 원하는 데이터값을 유지하기 위해서(보관하기 위해서) 특정 컬럼마다 제약(데이터 무결성 보장을 목적으로)
- 제약조건을 부여하면 컬럼에 데이터를 삽입 또는 수정할 때 마다 제약조건에 위배되지 않는지 검사
- 종류: NOT NULL, UNIGUE, CHECK, PRIMARY KEY, FOREIGN KEY
- 제약조건을 부여하는 방법: 컬럼레벨 / 테이블레벨
*/
/*
1. NOT NULL 제약조건
해당 컬럼에 반드시 값이 존재해야 할 경우 사용(NULL값이 절대 들어와서는 안되는 컬럼에 부여)
INSERT / UPDATE 시 NULL값을 허용하지 않도록 제한
NOT NULL 제약조건은 컬럼레벨 방식으로만 부여할 수 있음
*/
-- 새로운 테이블을 생성하면서 NOT NULL제야조건 달기
-- 컬럼레벨방식 : 컬럼명 자료형 제약조건 → 제약조건을 부여하고자 하는 컬럼 뒤에 곧바로 기술
CREATE TABLE TB_USER_NOT_NULL (
USER_NO NUMBER NOT NULL,
USER_ID VARCHAR2(15) NOT NULL,
USER_PWD VARCHAR2(20) NOT NULL,
USER_NAME VARCHAR(30),
GENDER CHAR(3),
PHONE VARCHAR2(13)
);
SELECT * FROM TB_USER_NOT_NULL;
INSERT INTO TB_USER_NOT_NULL VALUES(1, 'admin', '1234', '관리자', '남', '010-1234-5678');
INSERT INTO TB_USER_NOT_NULL VALUES(NULL, NULL, NULL, NULL, NULL, NULL); -- NOT NULL 제약조건에 위배
-- 실제 표현법 --
INSERT
INTO
TB_USER_NOT_NULL
VALUES
(
2,
'test',
'1234',
NULL,
NULL,
NULL
); -- NOT NULL 제약조건이 부여되어있는 칼럼에는 반드시 NULL이 아닌 값이 존재해야함!
SELECT * FROM TB_USER_NOT_NULL;
INSERT
INTO
TB_USER_NOT_NULL
VALUES
(
3,
'test',
'1234',
NULL,
NULL,
NULL
);
--------------------------------------------------------------------------------
/*
2. UNIQUE 제약조건
컬럼에 중복값을 제한하는 제약조건
INSERT / UPDATE 시 기존에 해당 컬럼값 중 중복값이 있을 경우 추가 또는 수정을 할 수 없도록 제약
컬럼레벨 / 테이블 레벨 방식 둘 다 가능
*/
CREATE TABLE TB_USER_UNIQUE(
USER_NO NUMBER NOT NULL,
USER_ID VARCHAR2(15) NOT NULL UNIQUE, -- 컬럼레벨 방식
USER_PWD VARCHAR2(20) NOT NULL,
USER_NAME VARCHAR(30),
GENDER CHAR(3),
PHONE VARCHAR2(13)
);
DROP TABLE TB_USER_UNIQUE; -- 삭제!
CREATE TABLE TB_USER_UNIQUE(
USER__NO NUMBER NOT NULL,
USER_ID VARCHAR2(20) NOT NULL,
USER_PWD VARCHAR2(20) NOT NULL,
USER_NAME VARCHAR2(30),
GENDER CHAR(3),
PHONE VARCHAR2(13),
UNIQUE(USER_ID) -- 테이블레벨 방식
);
SELECT * FROM TB_USER_UNIQUE;
INSERT INTO TB_USER_UNIQUE VALUES(1, 'admin', '1234', NULL, NULL, NULL);
INSERT INTO TB_USER_UNIQUE VALUES(2, 'admin', '3456', NULL, NULL, NULL);
-- UNIQUE 제약조건에 위배되었으므로 INSERT는 실패
-- 오류구문으로 유니크 제약조건이 위배되었다는 사실을 알려주기는 하지만 어떤 컬럼의 문제인지는 안알려줌
-- 쉽게 파악하기 어렵다는 문제가 있음 → 제약조건 부여 시 시스템이 알아서 임의의 제약조건명을 부여 SYS_C~~~
/*
* 제약조건 부여 시 제약조건명도 지정하는 방법
[ 컬럼레벨 방식 ]
CREATE TABLE 테이블명(
컬럼명 자료형,
컬렴명 자료형 CONSTRAINT 제약조건명 제약조건,
...
)
[ 테이블레벨 방식 ]
CREATE TABLE 테이블명 (
컬럼명 자료형,
컬럼명 자료형,
CONSTRAINT 제약조건명 제약조건 (컬럼명)
);
*/
CREATE TABLE TB_USER_CONSTRAINT (
USER_NO NUMBER CONSTRAINT NUM_NOT_NULL NOT NULL,
USER_ID VARCHAR2(20) NOT NULL,
USER_PWD VARCHAR2(20) NOT NULL,
USER_NAME VARCHAR2(30),
GENDER CHAR(3),
PHONE CHAR(13),
CONSTRAINT USER_ID_UNIQUE UNIQUE(USER_ID)
);
INSERT INTO TB_USER_CONSTRAINT VALUES (1, 'admin', '1234', NULL, NULL, NULL);
INSERT INTO TB_USER_CONSTRAINT VALUES (2, 'admin', '3456', NULL, NULL, NULL); -- 오류 보고 - ORA-00001: unique constraint (DDL.USER_ID_UNIQUE) violated
-- 제약조건명을 지정하면 오류 발생 시 문제가 생긴 컬럼을 조금 더 쉽게 유추할 수 있음
--------------------------------------------------------------------------------
-- GENDER컬럼에는 '남' or '여'라는 값만 들어가게 하려면?
/*
3. CHECK 제약조건
컬럼에 기록될 수 있는 값에 대한 조건을 설정할 수 있음
CHECK(조건식)
*/
CREATE TABLE TB_USER_CHECK(
USER_NO NUMBER NOT NULL,
USER_ID VARCHAR2(20) NOT NULL UNIQUE,
USER_PWD VARCHAR2(20) NOT NULL,
USER_NAME VARCHAR2(20),
GENDER CHAR(3) CHECK(GENDER IN('남','여')), -- 조건식의 결과가 ture여야지만 컬럽값을 INSERT 할 수 있음
PHONE VARCHAR(13),
ENROLL_DATE DATE
);
INSERT INTO TB_USER_CHECK VALUES(1, 'admin', '1234', NULL, '여', NULL, SYSDATE);
INSERT INTO TB_USER_CHECK VALUES(2, 'user01', '2345', NULL, '밥', NULL, SYSDATE); -- 불가
INSERT INTO TB_USER_CHECK VALUES(3, 'user02', 'pass02', NULL, NULL, NULL, SYSDATE);
-- CHECK 제약조건을 부여했다 하더라도 NULL값 INSERT할 수 있음 → NULL값이 들어오는 것도 막고싶다면 NOT NULL 제약조건도 같이 부여해야함
SELECT * FROM TB_USER_CHECK;
--------------------------------------------------------------------------------
-- 회원가입일을 항상 SYSDATE값으로 받고 싶은 경우 테이블에서 지정 가능 "DEFAULT"
/*
특정 컬럼에 들어올 값에 대해 기본값을 설정하는 방법 → 제약 조건과는 연관 없음
-- 테이블 만들기 실습 --
테이블 명: TB_USER_DEFAULT
컬럼 :
1. 회원 번호를 저장할 컬럼: NULL값 금지
2. 회원 아이디를 저장할 컬럼: NULL값 금지, 중복값 금지
3. 회원 비밀번호를 저장할 컬럼: NULL값 금지
4. 회원 이름
5. 회원 닉네임: 중복값 금지
6. 회원 성별: '남' or '여'만 INSERT
7. 전화번호
8. 이메일 저장
9. 주소
10. 가입일:NULL값 금지
*/
CREATE TABLE TB_USER_DEFAULT(
USER_NO NUMBER NOT NULL,
USER_ID VARCHAR2(20) NOT NULL UNIQUE,
USER_PWD VARCHAR2(20) NOT NULL,
USER_NAME VARCHAR2(30),
USER_NICKNAME VARCHAR2(15) UNIQUE,
GENDER CHAR(3) CHECK(GENDER IN('남','여')),
PHONE CHAR(13),
EMAIL VARCHAR(30),
ADRRESS VARCHAR(150),
ENROLL_DATE DATE DEFAULT SYSDATE NOT NULL
);
-- INSERT INTO TB_USER_DEFAULT VALUES(1, 'admin', 'pass01', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
/*
INSERT INTRO 테이블명(컬럼명1, 컬럼명2, 컬럼명3...()
VALUES (값1, 값2, 값3 ...)
*/
INSERT
INTO
TB_USER_DEFAULT
(
USER_NO,
USER_ID,
USER_PWD
)
VALUES
(
1,
'admin',
'pass01'
);
SELECT * FROM TB_USER_DEFAULT;
-- 지정 안된 컬럼은 기본적으로 NULL갑이 들어가있음
-- 만일 DEFAULT 값이 부여되어있다면 NULL값 대신 DEFATULT로 지정해놓은 값이 INSERT됨
--------------------------------------------------------------------------------
/*
4. PRIMARY KEY(기본키) 제약조건 ** 중요
테이블에가 각 행들의 정보를 유일하게 식별할 용도의 컬럼에 부여하는 제약 조건
→ 각 행들을 구분할 수 있는 식별자의 역할
예) 회원번호, 게시글번호, 학번, 사번, 예약번호, 주문번호...
→ 중복이 발생해선 안되고 값이 존재해야만 하는 컬럼에 PRIMAY KEY를 부여
한 테이블 당 한번만 사용 가능
*/
CREATE TABLE TB_USER_PK(
USER_NO NUMBER CONSTRAINT PK_USER PRIMARY KEY, -- 컬럼레벨방식
USER_ID VARCHAR2(15) NOT NULL UNIQUE,
UER_PWD VARCHAR2(20) NOT NULL,
USER_NAME VARCHAR2(30),
GENDER CHAR(3) CHECK(GENDER IN('남','여')),
PHONE VARCHAR2(13)
-- PRIMARY KEY(USER_NO) 테이블레벨 방식
);
INSERT INTO TB_USER_PK
VALUES (1, 'admin', '1234', NULL, NULL, NULL);
INSERT INTO TB_USER_PK
VALUES (1, 'user01', '3456', NULL, NULL, NULL); -- 오류발생 unique constraint (DDL.PK_USER) violated
-- UNIQUE 제약조건에 위배 == 기본키 컬럼에는 중복값을 INSERT 할 수 없음
INSERT INTO TB_USER_PK
VALUES (NILL, 'user02', '4567', NULL, NULL, NULL); -- 오류발생 column not allowed here
-- NOT NULL 제약조건 위배 == 기본키 컬럼에는 NULL값을 INSERT 할 수 없음
CREATE TABLE TB_PRIMARYKEY(
USER_NO NUMBER PRIMARY KEY,
USER_ID VARCHAR2(15) PRIMARY KEY,
USER_PWD VARCHAR2(20)
);
-- 오류발생 table can have only one primary key 하나의 테이블은 1개만 가질 수 있음
-- 두 개의 컬럼에 각각 PRIMARY KEY 제약조건을 부여할 수 있음
-- 두 개의 컬럼을 묶어서 하나의 PRIMARY KEY로 만들 수 있음 (찜하기 기능, 두개를 하나의 키로 만들면 중복값은 못들어오지만 사람에따라 상품에 따라 찜하기 가능함)
DROP TABLE PRODUCT;
CREATE TABLE PRODUCT(
NAME VARCHAR2(15),
PRODUCT VARCHAR2(50),
PRIMARY KEY(NAME, PRODUCT) -- 두 개의 컬럼을 묶어서 하나의 PRIMARY KEY로 설정 → 복합기
);
INSERT INTO PRODUCT VALUES('이승철', '민트치약');
INSERT INTO PRODUCT VALUES('이승철', '민트치약'); -- 오류
INSERT INTO PRODUCT VALUES('이승철', '딸기치약');
INSERT INTO PRODUCT VALUES('홍길동', '민트치약');
SELECT
PRODUCT
FROM
PRODUCT
WHERE
NAME = '이승철';
SELECT * FROM PRODUCT;
--------------------------------------------------------------------------------
-- 회원 등급에 대한 데이터(등급코드, 등급명) 보관하는 테이블
CREATE TABLE USER_GRADE( -- 부모테이블
GRADE_CODE CHAR(2) PRIMARY KEY,
GRADE_NAME VARCHAR(20) NOT NULL
);
INSERT INTO USER_GRADE VALUES('G1', '일반회원');
INSERT INTO USER_GRADE VALUES('G2', '우수회원');
INSERT INTO USER_GRADE VALUES('G3', '최우수회원');
SELECT
GRADE_CODE,
GRADE_NAME
FROM
USER_GRADE;
/*
5. FOREIGN KEY(외래키) 제약조건
다른 테이블에 존재하는 값만 컬럼에 INSERT하고 싶을 때 부여하는 제약조건
→ 다른 테이블(부모테이블)을 참조한다고 표현
참조하고 있는 테이블에 존재하는 값만 INSERT 할 수 있음
→ FOREIGN KEY 제약조건을 이용해서 다른 테이블간의 관계를 형성할 수 있음
[ 표현법 ]
- 컬럼 레벨 방식
컬럼명 자료형 REFERENCES 참조할테이블명(참조할컬럼명)
- 테입ㄹ 레벨 방식
FOREIGN KEY(컬럼명) REFERECES 참조할테이블명(참조할컬럼명)
두가지 방식 모두 참조할 컬럼명은 생략 가능.
생략할 경우 자동으로 참조할 테이블의 PRIMARY KEY컬럼이 참조할 컬럼명으로 설정됨
*/
CREATE TABLE TB_USER_CHILD( -- 자식테이블
USER_NO NUMBER PRIMARY KEY,
USER_ID VARCHAR2(15) NOT NULL UNIQUE,
USER_PWD VARCHAR2(20) NOT NULL,
GRADE_ID CHAR(2) REFERENCES USER_GRADE -- 컬럼레벨방식
-- FOREIGN KEY(GRADE_ID) REFERENCES USER_GRADE 테이블 레벨 방식
);
INSERT INTO TB_USER_CHILD
VALUES (1, 'admin', '1234', 'G1');
INSERT INTO TB_USER_CHILD
VALUES (2, 'user01', '3456', 'G2');
INSERT INTO TB_USER_CHILD
VALUES (3, 'user02', '4444', 'G1');
INSERT INTO TB_USER_CHILD
VALUES (4, 'user03', '3333', NULL); -- 모두 잘 들어감
SELECT * FROM TB_USER_CHILD;
INSERT
INTO
TB_USER_CHILD
VALUES
(
5,
'user04',
'1111',
'G4'
); -- integrity constraint 무결성제약조건에 위배.parent key not found 부모한테 G4가없어서
-- 회원번호, 회원아이디, 등급명을 조회해주세요.
SELECT
USER_NO,
USER_ID,
GRADE_ID
FROM
TB_USER_CHILD
LEFT -- NULL값 포함
JOIN
USER_GRADE ON (GRADE_ID = GRADE_CODE);
-- 부모테이블(USER_GRADE)에서 데이터를 삭제
-- USER_GRADE 테이블로부터 GRADE_CODE가 G1인 행을 삭제
DELETE
FROM
USER_GRADE
WHERE
GRADE_CODE = 'G1';
-- child record found
-- 자식테이블에서 데이터를 사용하고있는 컬럼이 존재하기 때문에 삭제할 수 없음
-- 자식테이블에서 부모테이블에 존재하는 값을 사용하고 있을 경우 삭제가 불가능한 "삭제제한옵션"이 걸려있음.
-- 테이블 생성 시 삭제 제한 옵션을 변경할 수 있음
DELETE
FROM
USER_GRADE
WHERE
GRADE_CODE = 'G3';
-- 자식테이블에서 사용하고 있지 않은 데이터는 삭제 잘됨
SELECT * FROM USER_GRADE;
ROLLBACK;
--------------------------------------------------------------------------------
/*
* 자식테이블 생성 시 외래키 제약조건을 부여할 경우
부모테이블의 데이터가 삭제되었을 때 자식테이블에서는 어떻게 처리할 것인지 옵션을 지정할 수 있음
삭제옵션을 따로 지정하지 않는다면 기본설정은 ON DELETE RESTRICTED(삭제제한)이 설정됨
*/
-- 1) ON DELETE SET NULL == 부모 데이터 삭제 시 해당 데이터를 사용하고 있는 자식 레코드를 NULL값으로 변경시키는 옵션
CREATE TABLE TB_USER_ODSN(
USER_NO NUMBER PRIMARY KEY,
GRADE_ID CHAR(2),
FOREIGN KEY(GRADE_ID) REFERENCES USER_GRADE ON DELETE SET NULL
);
INSERT INTO TB_USER_ODSN VALUES(1, 'G1');
INSERT INTO TB_USER_ODSN VALUES(2, 'G2');
INSERT INTO TB_USER_ODSN VALUES(3, 'G3');
SELECT * FROM TB_USER_ODSN;
-- 부모테이블 (USER_GRADE)의 GRADE_CODE가 G1인 행을 삭제
DELETE
FROM
USER_GRADE
WHERE
GRADE_CODE = 'G1'; -- 삭제됨
-- 자식테이블(TB_USER)ODSN)의 GRADE_ID컬럼이 값이 G1이던 것들이 모두 NULL로 변경
ROLLBACK;
-- 2) ON DELETE CASCADE : 부모데이터 삭제 시 해당 데이터를 사용하고 있는 자식데이터도 같이 삭제
CREATE TABLE TB_USER_ODC(
USER_NO NUMBER PRIMARY KEY,
GRADE_ID CHAR(2),
FOREIGN KEY(GRADE_ID) REFERENCES USER_GRADE ON DELETE CASCADE
);
INSERT INTO TB_USER_ODC VALUES(1, 'G1');
INSERT INTO TB_USER_ODC VALUES(2, 'G2');
INSERT INTO TB_USER_ODC VALUES(3, 'G1');
INSERT INTO TB_USER_ODC VALUES(4, NULL);
SELECT * FROM TB_USER_ODC;
DELETE FROM USER_GRADE WHERE GRADE_CODE = 'G1';
-- 삭제 성공
-- 자식테이블(TB_USER_ODC)의 GRADE_ID컬럼의 값이 G1인 행들이 모두 삭제!
/*
꼭 외래키 제약조건이 걸려있어야만 JOIN을 할 수 있는것은 아님
*/
--------------------------------------------------------------------------------
/*
-- 여기서부터는 쿼리문 수행을 KH계정으로 바꿔서 함 --
* SUBQUERY를 이용한 테이블 생성(복사개념)
[ 표현법 ]
CREATE TABLE 테이블명
AS 서브쿼리;
서브쿼리를 수행한 결과로 새롭게 테이블을 생성
*/
SELECT * FROM EMPLOYEE;
CREATE TABLE EMPLOYEE_COPY
AS SELECT * FROM EMPLOYEE;
-- 컬럼들, 조회결과의 데이터값들, 제약조건은 NOT NULL만 복사됨
SELECT * FROM EMPLOYEE_COPY;
SELECT * FROM EMPLOYEE WHERE 0 = 1; -- 결과가 없으니 칼럼만 조회 가능
CREATE TABLE EMPLOYEE_COPY2 AS
SELECT
*
FROM
EMPLOYEE
WHERE
0 = 1; -- 구조만 복사 가능
SELECT * FROM EMPLOYEE_COPY2;
CREATE TABLE EMPLOYEE_COPY3
AS
SELECT
EMP_ID,
EMP_NAME,
SALARY * 12 AS "연봉"
FROM
EMPLOYEE;
SELECT * FROM EMPLOYEE_COPY3;
--------------------------------------------------------------------------------
/*
* 테이블이 생성된 후 제약조건을 추가 (ALTER TABLE 테이블명 XXXXXXXXXX)
- PRIMARY KEY : ADD PRIMARY KEY(컬럼명);
- FOREIGN KEY : ADD FOREIGN KEY(컬럼명) REFERENCES 테이블며이
- UNIQE : ADD UNIQUE(컬럼명);
- CHECK : ADD CHECK (컬럼명);
- NOT NULL : MODIFY 컬럼명 NOU NULL;
*/
-- EMPLOYEE_COPY테이블에 존재하지 않은 PRIMARY KEY제약조건 추가 → EMP_ID컬럼에
ALTER TABLE EMPLOYEE_COPY ADD PRIMARY KEY(EMP_ID);
-- EMPLOYEE_COPY 테이블에 DEPT_CODE컬럼에 외래키 제약조건 추가 (DEPARTMENT테이블의 DEPT_ID를 참조)
ALTER TABLE EMPLOYEE_COPY ADD FOREIGN KEY(DEPT_CODE) REFERENCES DEPARTMENT(DEPT_ID);
'oracle' 카테고리의 다른 글
| Oracle_DDL_CREATE / ALTER / DROP (1) | 2024.10.27 |
|---|---|
| Orcale_DML_INSERT / UPDATE / DELETE (0) | 2024.10.27 |
| Oracle_DML_SUB QUERY 서브쿼리 (3) | 2024.10.21 |
| Oracle_DML_FUNCTION (2) | 2024.10.20 |
| Oracle_DML_SELECT문 (0) | 2024.10.20 |