-- ○ (무결성) 제약조건
-- 1. 데이터 무결성 : 완전성, 정확성, 일관성을 보장하는 특성. ==> 트랜잭션 ACID
-- ※ 트랜잭션 : 데이터베이스의 논리적 실행 단위 ==> DML (데이터 입력,수정,삭제) + COMMIT
-- Atomicity : 원자성, 트랜잭션이 모두 실행되거나 하나도 실행되지 않게
-- Consistency : 일관성, 트랜잭션 처리 이후 데이터의 모순이 없는 상태 (잔고가 없는 상태의 트랜잭션은 중단)
-- Isolation : 독립성, 트랜잭션 처리도중 다른 트랜잭션이 개입하지 못하는 상태
-- Durability : 지속성, 성공적인 트랜잭션 처리 이후 영원히 반영되는 상태(이체: A계좌 잔액감소, B계좌는 증가)
-- 2. 제약조건 : 데이터의 무결성을 지키기 위해 제한된(한) 조건을 말한다
-- 2-1. Primary Key : 주식별자, PK ==> 중복되지 않는, NULL 허용하지 않는 특성(=NOT NULL)
-- └ 사원ID는 중복되지 않는, NULL 허용하지 않는 유일한 식별자
-- 2-2. Unique Key : 유일키, UK ==> 중복되지 않는, NULL 허용하는 특성
-- └ 게시물 TITLE은 중복을 허용하지 않도록하는 유일키
--
-- 2-3. NOT NULL : NN ==> 빈값(NULL) 허용하지 않는 특성
-- └ 게시물의 TITLE은 빈값을 허용하지 않게
--
-- 2-4. CHECK : 체크, CK ==> 특정 값의 범위인지에 따라서 트랜잭션을 실행하는 특성
-- └ 사원정보를 등록할때 salary를 0으로 입력되지 않게 ==> 최저급여? 최저시급을 준수하게~
--
-- 2-5. Foreign Key : 외래키, FK ==> 다른 테이블의 PK를 참조하는 특성 (
-- └ 사원정보중 부서정보를 입력할때 없는 부서ID를 등록하지 못하게 REFERENCES~
--
-- 2-6. DEFAULT : 기본값O, 제약조건X
-- └ 게시물 등록시, 입력일자를 오늘날짜/시간으로 기본값으로 선택하게
-- 3.제약조건 실습
-- 3-1. 제약조건 확인
SELECT constraint_name, constraint_type, table_name
FROM user_constraints;
-- SYS_C008370 : 시스템이 자동으로 부여하는 제약조건명 SYS_CXXXXX 형태로 넘버링
-- ※ 제약조건명을 관례상 테이블명_컬럼_제약조건약어 형태로 작성한다.
-- Constraint Type / 약어
-- P : Primary Key ==> PK
-- U : Unique Key ==> UK
-- C : Check ==> CK
-- R : Reference ==> FK
-- Not NULL ==> NN
CREATE TABLE members (
id VARCHAR2(20) PRIMARY KEY, -- 컬럼 레벨: SYS_CXXXXX
name VARCHAR2(20) UNIQUE NOT NULL,
email VARCHAR2(50)
);
CREATE TABLE members (
id VARCHAR2(20) CONSTRAINT member_id_pk PRIMARY KEY, -- 컬럼 레벨: member_id_pk
name VARCHAR2(20) UNIQUE NOT NULL,
email VARCHAR2(50)
);
--Table MEMBERS이(가) 생성되었습니다.
-- 1) Not NULL (NULL) : NULL을 허용하지 않음.
CREATE TABLE null_test (
-- 컬럼명 자료형(길이) 제약조건
id VARCHAR2(10) NOT NULL,
pw VARCHAR2(20)
);
--Table NULL_TEST이(가) 생성되었습니다.
-- NULL : '' 또는 NULL(or null) 명시하면 빈값으로 처리
INSERT INTO null_test
VALUES ('test1',null);
--1 행 이(가) 삽입되었습니다.
INSERT INTO null_test
VALUES ('test2','');
--1 행 이(가) 삽입되었습니다.
INSERT INTO null_test
VALUES ('','pwd3');
--SQL 오류: ORA-01400: NULL을 ("HANUL"."NULL_TEST"."ID") 안에 삽입할 수 없습니다
--01400. 00000 - "cannot insert NULL into (%s)"
UPDATE null_test
SET id=''
WHERE id='테스트1';
--SQL 오류: ORA-01407: NULL로 ("HANUL"."NULL_TEST"."ID")을 업데이트할 수 없습니다
--01407. 00000 - "cannot update (%s) to NULL"
SELECT constraint_name, constraint_type, table_name
FROM user_constraints
WHERE table_name='CHECK_TEST';
-- 2) CHECK 제약조건
-- NUMBER : 최대 4000byte 이내
-- NUMBER(10) : 10byte 이내
-- NUMBER(8,2) : 전체 8자리 숫자에서 6자리 정수, 2자리 소수
CREATE TABLE check_test (
id NUMBER(10),
name VARCHAR2(20),
salary NUMBER(8) CHECK (salary > 3000)
);
--Table CHECK_TEST이(가) 생성되었습니다.
INSERT INTO check_test
VALUES (1, '홍길동', 2000);
--ORA-02290: 체크 제약조건(HANUL.SYS_C008375)이 위배되었습니다
INSERT INTO check_test
VALUES (1, '홍길동', 3500);
--1 행 이(가) 삽입되었습니다.
CREATE TABLE check_test2 (
id NUMBER(10),
name VARCHAR2(20),
gender CHAR(1) CHECK (gender IN ('M','F'))
);
--Table CHECK_TEST2이(가) 생성되었습니다.
INSERT INTO check_test2
VALUES (1, '홍길동', 'A');
--ORA-02290: 체크 제약조건(HANUL.SYS_C008376)이 위배되었습니다
-- 3) UNIQUE 제약조건
-- 유일한 값, 중복은 허용 vs PRIMARY KEY : 유일한 값, 중복 허용x (NOT NULL + UNIQUE)
-- ※ 복합키 생성가능 ==> UNIQUE (id, name)
CREATE TABLE unique_test (
id NUMBER(10) NOT NULL,
title VARCHAR(30) UNIQUE NOT NULL,
content VARCHAR(50)
);
--Table UNIQUE_TEST이(가) 생성되었습니다.
INSERT INTO unique_test
VALUES (1, 'Hello WOrld!','System.out.print("Hello World")');
--1 행 이(가) 삽입되었습니다.
INSERT INTO unique_test
VALUES (2, 'Hello WOrld!','System.out.print("Hello World")');
-- ORA-00001: 무결성 제약 조건(HANUL.SYS_C008379)에 위배됩니다
ALTER TABLE unique_test
DROP CONSTRAINT SYS_C008379;
--Table UNIQUE_TEST이(가) 변경되었습니다. ==> 제약조건 삭제
ALTER TABLE unique_test
ADD CONSTRAINT unique_test_title_uk UNIQUE(title);
--ORA-02299: 제약 (HANUL.UNIQUE_TEST_TITLE_UK)을 사용 가능하게 할 수 없음 - 중복 키가 있습니다
TRUNCATE TABLE unique_test;
--Table UNIQUE_TEST이(가) 잘렸습니다.
INSERT INTO unique_test
VALUES (2, 'Hello WOrld!','System.out.print("Hello World")');
-- 1 행 이(가) 삽입되었습니다
SELECT *
FROM user_constraints
WHERE table_name = 'PK_TEST';
-- 4) PRIMARY KEY 제약조건
-- 유일한 값, 중복 허용x 특성
-- ※ 복합키 생성가능 ==> PRIMARY KEY (id, name)
CREATE TABLE pk_test (
id NUMBER PRIMARY KEY,
title VARCHAR2(30) UNIQUE
);
--Table PK_TEST이(가) 생성되었습니다.
ALTER TABLE pk_test
DROP CONSTRAINT SYS_C008382;
-- Table PK_TEST이(가) 변경되었습니다. : 시스템이 명명한 제약조건 삭제
ALTER TABLE pk_test
ADD CONSTRAINT pktest_id_pk PRIMARY KEY(id);
-- Table PK_TEST이(가) 변경되었습니다. : 사용자가 명명한 제약조건 추가 (단일키)
ALTER TABLE pk_test
DROP CONSTRAINT PKTEST_ID_PK;
-- Table PK_TEST이(가) 변경되었습니다. : 사용자가 명명한 제약조건 삭제
ALTER TABLE pk_test
ADD CONSTRAINT pktest_id_title_pk PRIMARY KEY(id, title);
-- Table PK_TEST이(가) 변경되었습니다. : 사용자가 명명한 제약조건 추가 (복합키)
-- 5) FOREIGN KEY 제약조건
-- 외래키, 참조키, FK
-- ※ 부모 테이블의 특정 컬럼을 자식 테이블에서 참조
-- 복합키 설정 가능, NULL 허용
-- ex> employees 테이블의 department_id 컬럼이, departments 테이블의 department_id
-- 컬럼을 참조하여, 사원 데이터(row) 입력시 존재하는 부서 번호를 입력하도록 제약함.
-- CTAS : 다른 테이블의 1)구조만 복사하거나 2) 구조 + 데이터 복사
-- =============================================================================
-- 오라클 데이터베이스 이모지 : NVARCHAR2 로 설정해야, 정상적으로 저장된다.
-- MariaDB 이모지 : utf8mb4_general_ci 타입등으로 COLLATE를 mb(multi byte)로 지정해야 함.
-- =============================================================================
-- 부모 테이블
CREATE TABLE "dept_test" (
"dept_id" NUMBER,
"dept_name" VARCHAR2(20) NOT NULL UNIQUE,
CONSTRAINT dept_id_pk PRIMARY KEY (dept_id)
);
-- Table DEPT_TEST이(가) 생성되었습니다.
/* MariaDB CREATE코드 : ` (백틱) - 테이블명, 컬럼명 구분 기호, ' - 문자열 , " - 공백
CREATE TABLE `dept_test` (
`dept_id` INT NOT NULL,
`dept_name` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`dept_id`)
)
COLLATE='utf8mb4_general_ci'
;*/
-- 자식 테이블
CREATE TABLE emp_test (
emp_id NUMBER,
last_name VARCHAR2(20) NOT NULL,
job_id VARCHAR2(10),
emp_dept NUMBER,
CONSTRAINT emp_id_pk PRIMARY KEY (emp_id), -- 테이블 레벨에서 정의
CONSTRAINT dept_test_id_fk FOREIGN KEY (emp_dept) REFERENCES dept_test (dept_id)
);
--Table EMP_TEST이(가) 생성되었습니다.
DESC dept_test;
INSERT INTO dept_test
VALUES (10, '개발부');
INSERT INTO dept_test
VALUES (20, '기획부');
INSERT INTO dept_test
VALUES (30, '설계부');
DESC emp_test;
INSERT INTO emp_test (emp_id, last_name, job_id)
VALUES (1, 'Lee', 'Backend');
INSERT INTO emp_test (emp_id, last_name, job_id, emp_dept)
VALUES (2, 'Choi', 'FrontEnd', 100);
--ORA-02291: 무결성 제약조건(HANUL.DEPT_TEST_ID_FK)이 위배되었습니다- 부모 키가 없습니다
INSERT INTO emp_test (emp_id, last_name, job_id, emp_dept)
VALUES (2, 'Choi', 'FrontEnd', 20);
--1 행 이(가) 삽입되었습니다.
'BackEnd > Backend 공부 정리' 카테고리의 다른 글
| sqldeveloper-12 (0) | 2024.08.22 |
|---|---|
| Java-12 (0) | 2024.08.22 |
| Java-11 (2) | 2024.08.21 |
| sqldeveloper-10 (0) | 2024.08.20 |
| Java-10 (0) | 2024.08.20 |