[SQL] 데이터 품질 높이기 - PRIMARY KEY

·2025년 7월 15일
0

SQL

목록 보기
119/126

💡 제약(contraint)이란?

  • 데이터의 품질을 높이기 위해서 데이터베이스에 입력, 수정되는 데이터의 제한을 강제로 두는 기능
  • 좋은 품질의 데이터가 테이블에 저장이 되어야 좋은 데이터 분석을 할 수 있음
  • 데이터 분석시 데이터 분석가들이 어려워하는 부분 중 하나가 결측치를 처리하는 부분
    • 아예 처음부터 결측치가 입력 안되도록 테이블 설계를 하는게 가장 좋은 방법

📌 제약의 종류 5가지

  1. primary key : 중복된 데이터와 null 값을 입력하지 못하게 하는 제약
  2. unique : 중복된 데이터를 입력하지 못하게 하는 제약
  3. not null : null 값을 입력 못하게 하는 제약
  4. check : 사용자가 지정한 데이터만 허용하겠금 하는 제약
  5. foreign key : 부모 테이블의 데이터를 참조하기 위해서 사용하는 제약

실습1. emp 테이블에 empno 데이터의 품질을 높이기 위해서 primary key 제약을 거시오

cmd에서 @demo 돌리기

alter table emp
 add constraint emp_empno_pk primary key(empno);
 
select constraint_name, table_name
 from user_constraints
 where table_name='EMP';

📌 primary key 만드는 코드

alter table 테이블명
add constraint 제약조건명 primary key(컬럼명);


실습2. EMP 테이블에 KING 의 사원번호를 7788로 변경하시오

-- 에러발생: 무결성 제약 조건(C##SCOTT.EMP_EMPNO_PK)에 위배

update emp
 set empno = 7788
 where ename='KING';

실습3. 아래의 데이터를 사원 테이블에 입력하시오

사원번호 : NULL
사원이름: JACK
월급: 3000

insert into emp(empno, ename, sal)
values( null, 'JACK', 3000 );

-- SQL 오류:
-- ORA-01400: NULL을 ("C##SCOTT"."EMP"."EMPNO") 안에 삽입할 수 없습니다

문제1. dept 테이블에 deptno 에 primary key 제약을 거시오

alter table dept
 add constraint dept_deptno_pk primary key(deptno);

문제2. 아래의 쿠팡 테이블을 생성하려 합니다. 테이블을 만들고 필요한 컬럼에 primary key 제약을 거세요.

테이블: cuppang_order

컬럼명: order_id (주문번호), prod_name(상품명), prod_price(상품가격), order_date(주문날짜), order_cnt(수량)

drop table cuppang_order;

create table cuppang_order
( order_id number(10),
  prod_name varchar2(50),
  prod_price number(10,2),
  order_date date,
  order_cnt number(10) );

alter table cuppang_order
 add constraint cp_order_id primary key(order_id);
 
insert into cuppang_order
values(1, '서울우유', 2400, to_date('2025/07/01', 'RRRR/MM/DD'), 1);

insert into cuppang_order
values(2, '바나나 우유', 1500, to_date('2025/07/02', 'RRRR/MM/DD'), 3);

-- 제약 확인
select a.constraint_name, a.constraint_type, b.column_name
 from user_constraints a, user_cons_columns b
 where a.constraint_name = b.constraint_name
 and lower(a.table_name) = 'cuppang_order';

문제3. 다시 cuppang_order 테이블을 drop 하고 다시 생성하는데 다음과 같이 테이블 생성시 바로 제약이 반영되게 생성하시오.

drop table cuppang_order;

create  table cuppang_order
( order_id  number(10) constraint cp_order_id_pk primary key ,
  prod_name varchar2(30),
  prod_price number(10,2),
  order_date date,
  order_cnt number(10) );
  
-- alter table cuppang_order
-- add constraint cp_order_id primary key(order_id);
 
insert into cuppang_order
values( 1, '서울우유', 2400, to_date('2025/07/01','RRRR/MM/DD'), 1 );

insert into cuppang_order
values( 2, '바나나 우유', 1500, to_date('2025/07/02','RRRR/MM/DD'), 3 );

-- 제약 확인
select a.constraint_name, a.constraint_type, a.table_name, b.column_name
 from user_constraints a, user_cons_columns b
 where a.constraint_name = b.constraint_name
 and lower(a.table_name) = 'cuppang_order';


문제4. 아래의 employees 테이블을 생성하시오

create table employees
( employee_id number(10) constraint emp_id_pk primary key,
  first_name varchar2(20),
  last_name varchar2(20),
  email varchar2(20),
  phone_number varchar2(30),
  hire_date date,
  job_id varchar2(10),
  salary number(20),
  commission_pct number(10,2),
  manager_id number(10),
  department_id number(10) );
  
insert into employees
select *
 from hr.employees;
 
select * from employees;

마지막 문제. 아래의 departments 테이블을 생성하시오

  1. primary key 제약도 걸고
  2. 데이터로 이행해야 함

create table departments
( department_id number(10) constraint dept_id_pk primary key,
  department_name varchar2(30),
  manager_id number(10),
  location_id number(10) );
  
insert into departments
select *
 from hr.departments;
 
select * from departments;

0개의 댓글