본문 바로가기
Programming/DB

[Oracle] PRIMARY KEY(기본키) 제약조건

by AI_Wooah 2022. 3. 7.
  • PRIMARY KEY(기본키) 제약조건
    : 테이블에서 한 행의 정보를 찾기 위해 사용하는 컬럼을 의미한다.
    • 테이블에 대한 식별자 역할을 한다.
    • NOT NULL + UNIQUE 제약조건의 의미
    • 한 테이블당 한 개만 설정할 수 있음
    • 컬럼 레벨, 테이블 레벨 둘 다 설정 가능함
    • 한 개 컬럼에 설정할 수도 있고, 여러 개의 컬럼을 묶어서 설정할 수 있음
CREATE TABLE USER_PRIMARYKEY (
  USER_NO NUMBER CONSTRAINT PK_USER_NO PRIMARY KEY, --컬럼 레벨
  USER_ID VARCHAR2(20) UNIQUE,
  USER_PWD VARCHAR2(30) NOT NULL,
  USER_NAME VARCHAR2(30),
  GENDER VARCHAR2(10),
  PHONE VARCHAR2(30),
  EMAIL VARCHAR2(50)
);

INSERT INTO USER_PRIMARYKEY
VALUES(1, 'user01', 'pass01', '홍길동', '남',
       '010-1234-5678', 'hong123@kg.or.kr');
       
INSERT INTO USER_PRIMARYKEY
VALUES (1, 'user02', 'pass02', '이순신', '남',
        '010-5678-9012', 'lee123@kh.or.kr');

INSERT INTO USER_PRIMARYKEY
VALUES (NULL, 'user03', 'pass03', '유관순', '여',
        '010-9999-3131', 'yoo123@kh.or.kr');

SELECT UC.TABLE_NAME, UCC.COLUMN_NAME, UC.CONSTRAINT_NAME,
       UC.CONSTRAINT_TYPE
  FROM USER_CONSTRAINTS UC
  JOIN USER_CONS_COLUMNS UCC ON (UC.CONSTRAINT_NAME = UCC.CONSTRAINT_NAME)
 WHERE UC.CONSTRAINT_NAME = 'PK_USER_NO';

SELECT
       UC.TABLE_NAME
     , UCC.COLUMN_NAME
     , UC.CONSTRAINT_NAME
     , UC.CONSTRAINT_TYPE
  FROM USER_CONSTRAINTS UC
  JOIN USER_CONS_COLUMNS UCC ON (UC.CONSTRAINT_NAME = UCC.CONSTRAINT_NAME)
 WHERE UC.CONSTRAINT_NAME = 'PK_USER_NO';
 
CREATE TABLE USER_PRIMARYKEY2(
  USER_NO NUMBER,
  USER_ID VARCHAR2(20),
  USER_PWD VARCHAR2(30) NOT NULL,
  USER_NAME VARCHAR2(30),
  GERNDER VARCHAR2(10),
  PHONE VARCHAR2(30),
  EMAIL VARCHAR2(50),
  CONSTRAINT PK_USER_NO2 PRIMARY KEY (USER_NO, USER_ID)  -- 테이블에 제약조건(USER_NO, USER_ID)묶어서 하나에 PRIMARY KEY 제약조건설정
);

INSERT INTO USER_PRIMARYKEY2
VALUES (1, 'user01', 'pass01', '홍길동', '남', '010-1234-5678', 'hong123@kh.or.kr');

INSERT INTO USER_PRIMARYKEY2
VALUES (1, 'user02', 'pass02', '이순신', '남', '0105678-9012', 'lee123@kh.or.kr');

INSERT INTO USER_PRIMARYKEY2
VALUES (2, 'usero1', 'pass01', '유관순', '여', '010-9999-3131', 'yoo123@kh.or.kr');

SELECT
       *
  FROM USER_PRIMARYKEY2;

INSERT INTO USER_PRIMARYKEY2
VALUES (1, 'user01', 'pass01', '신사임당', '여', '010-9999-9999', 'shin123@kh.or.kr');

SELECT
       UC.TABLE_NAME
     , UCC.COLUMN_NAME
     , UC.CONSTRAINT_NAME
     , UC.CONSTRAINT_TYPE
  FROM USER_CONSTRAINTS UC
  JOIN USER_CONS_COLUMNS UCC ON (UC.CONSTRAINT_NAME = UCC.CONSTRAINT_NAME)
 WHERE UC.TABLE_NAME = 'USER_PRIMARYKEY2'; 

-- FOREIGN KEY(외부키 / 외래키) 제약조건
-- 참조(REFERENCES)된 다른 테이블에서 제공하는 값만 사용할 수 있음
-- 참조 무결성을 위배하지 않게 하기 위해 사용
-- FOREIGN KEY 제약조건에 의해서
-- 테이블간의 관계(RELATIONSHIP)가 형성됨
-- 제공되는 값 외에는 NULL을 사용할 수 있음

-- 컬럼레벨일 경우
-- 컬럼명 자료형(크기) [CONSTRAINT 이름] REFERENCES 참조할테이블 [(참조할컬럼)] [삭제룰]

-- 테이블 레벨일 경우
-- [CONSTRAINT 이름] FOREIGN KEY(적용할컬럼명) REFERENCES 참조할테이블명 [(참조할컬럼)] [삭제룰]

-- 참조할 테이블의 참조할 컬럼명이 생략되면
-- PRIMARY KEY로 설정된 컬럼이 자동 참조할 컬럼이 됨

-- 참조될 수 있는 컬럼은 PRIMARY KEY 컬럼과,
-- UNIQUE 지정된 컬럼만 외래키로 사용할 수 있음
CREATE TABLE USER_GRADE (
  GRADE_CODE NUMBER PRIMARY KEY,
  GRADE_NAME VARCHAR2(30) NOT NULL
);

INSERT INTO USER_GRADE
VALUE (10, '일반회원');
INSERT INTO USER_GRADE
VALUE (20, '우수회원');
INSERT INTO USER_GRADE
VALUE (30, '특별회원');

COMMIT;

SELECT * FROM USER_GRADE;

CREATE TABLE USER_FOREIGNKEY(
  USER_NO NUMBER PRIMARY KEY,
  USER_ID VARCHAR2(20) UNIQUE,
  USER_PWD VARCHAR2(30) NOT NULL,
  USER_NAME VARCHAR2(30),
  GENDER VARCHAR2(10),
  PHONE VARCHAR2(30),
  EMAIL VARCHAR2(50),
  GRADE_CODE NUMBER,
  CONSTRAINT FK_GRADE_CODE FOREIGN KEY(GRADE_CODE)
  REFERENCES USER_GRADE (GRADE_CODE)
);

INSERT INTO USER_FOREIGNKEY
VALUES(1, 'user01', 'pass01', '홍길동', '남',
       '010-1234-5678', 'hong123@kg.or.kr', 10);

INSERT INTO USER_FOREIGNKEY
VALUES (2, 'user02', 'pass02', '이순신', '남',
        '010-5678-9012', 'lee123@kh.or.kr', 20);

INSERT INTO USER_FOREIGNKEY
VALUES (3, 'user03', 'pass03', '유관순', '여',
        '010-9999-3131', 'yoo123@kh.or.kr', 30);

INSERT INTO USER_FOREIGNKEY
VALUES (4, 'user04', 'pass04', '안중근', '남',
        '010-2222-0000', 'ahn123@kh.or.kr', null);

INSERT INTO USER_FOREIGNKEY
VALUES (5, 'user05', 'pass05', '윤봉길', '남',
        '010-6666-1234', 'yoon123@kh.or.kr', 50);

COMMIT;

SELECT 
       UC.TABLE_NAME
     , UCC.COLUMN_NAME
     , UC.CONSTRAINT_NAME
     , UC.CONSTRAINT_TYPE
  FROM USER_CONSTRAINTS UC
     , USER_CONS_COLUMNS UCC
 WHERE UC.CONSTRAINT_NAME = UCC.CONSTRAINT_NAME
   AND UC.CONSTRAINT_NAME = 'FK_GRADE_CODE';
   -- CONSTRAINT_TYPE = R 은 REFERENCES를 의미
   
-- USER_FOREIGNKEY 테이블에서
-- 회원 아이디, 이름, 성별, 연락처, 회원등급명 조회
SELECT
       USER_ID
     , USER_NAME
     , GENDER
     , PHONE
     , GRADE_NAME
  FROM USER_FOREIGNKEY
--  LEFT JOIN USER_GRADE USING (GRADE_CODE);
NATURAL LEFT JOIN USER_GRADE; -- 참조할 컬럼명을 써주지 않아도 외래키를 자동으로 기본키로 설정.
-- OUTER JOIN의 경우 방향을 설정해줘야 하지만 INNER JOIN의 경우 생략해도 무관

DROP TABLE USER_GRADE;

CREATE TABLE USER_FOREIGNKEY2 (
 USER_NO NUMBER PRIMARY KEY,
 USER_ID VARCHAR2(20) UNIQUE,
 USER_PWD VARCHAR2(30) NOT NULL,
 USER_NAME VARCHAR2(30),
 GENDER VARCHAR2(10),
 PHONE VARCHAR2(30),
 EMAIL VARCHAR2(50),
 GRADE_CODE NUMBER,
 CONSTRAINT FK_GRADE_CODE2 FOREIGN KEY (GRADE_CODE)
 REFERENCES USER_GRADE2 (GRADE_CODE) ON DELETE SET NULL
);

-- ON DELETE CASCADE : 부모 키 삭제 시 자식 키를 가진 행도 함께 삭제
CREATE TABLE USER_GRADE3 (
  GRADE_CODE NUMBER PRIMARY KEY,
  GRADE_NAME VARCHAR2(30) NOT NULL
);

INSERT INTO USER_GRADE3
VALUE (10, '일반회원');
INSERT INTO USER_GRADE3
VALUE (20, '우수회원');
INSERT INTO USER_GRADE3
VALUE (30, '특별회원');

CREATE TABLE USER_FOREIGNKEY3 (
 USER_NO NUMBER PRIMARY KEY,
 USER_ID VARCHAR2(20) UNIQUE,
 USER_PWD VARCHAR2(30) NOT NULL,
 USER_NAME VARCHAR2(30),
 GENDER VARCHAR2(10),
 PHONE VARCHAR2(30),
 EMAIL VARCHAR2(50),
 GRADE_CODE NUMBER,
 CONSTRAINT FK_GRADE_CODE3 FOREIGN KEY (GRADE_CODE)
 REFERENCES USER_GRADE3 (GRADE_CODE) ON DELETE SET NULL
);

COMMIT;

SELECT * FROM USER_GRADE3;
SELECT * FROM USER_FOREIGNKEY3;

DELETE FROM USER_GRADE3
WHERE GRADE_CODE = 10;

-- 서브쿼리를 이용한 테이블 생성
-- 컬럼명, 데이터 타입, 값이 복사가 되고,
-- 제약조건은 NOT NULL만 복사됨
CREATE TABLE EMPLOYEE_COPY
AS SELECT * FROM EMPLOYEE;

SELECT * FROM EMPLOYEE_COPY;

-- 테이블의 데이터를 제외한 구조만 복사
CREATE TABLE EMPLOYEE_COPY2
AS SELECT *
     FROM EMPLOYEE
    WHERE 1 = 0;

SELECT * FROM EMPLOYEE_COPY2;

CREATE TABLE EMPLOYEE_COPY3
AS SELECT
          EMP_ID
        , EMP_NAME
        , SALARY
        , DEPT_TITLE
        , JOB_NAME
     FROM EMPLOYEE
     LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
     LEFT JOIN JOB USING(JOB_CODE);

SELECT * FROM EMPLOYEE_COPY3;
반응형

'Programming > DB' 카테고리의 다른 글

Database(ORACLE)  (0) 2022.03.07
[Oracle] DML-SELECT  (0) 2022.03.07
[Oracle] 테이블 생성 및 데이터 insert  (0) 2022.03.07
[Oracle] subquery  (0) 2022.03.07
[Oracle] JOIN  (0) 2022.03.07

댓글