#16 !CONSTRAINT(제약조건)!
오늘의 노래!!!
- 아티스트
- IVE (아이브)
- 앨범
- I've IVE
- 발매일
- 2023.04.10
[0] 개념이해하기!!
CONSTRAINT(제약조건)
: 테이블의 특정 컬럼에 지정, 제약조건에 부합하지 않은 데이터는 저장불가
- 무결성 제약조건 : 데이터 무결성은 데이터베이스에 저장된 데이터의 일관성과 정확성을 지키는 것을 말한다.
일관성과 정확성을 잃어버린 데이터베이스는 정보로서의 가치에 심각한 문제가 있다.
(1) 영역 무결성(Domain integrity)
- 도메인 제약, 릴레이션 내의 튜플들이 각 속성의 도메인에 지정된 값만 가져야한다.
(2) 객체 무결성(Entity integrity)
- 기본키(PK) 제약, 릴레이션에 기본키를 저장하고, 그에 따른 무결성 원칙
- 기본키는 NULL을 가져서는 안되고, 릴레이션 내에 오직 하나의 값만 존재
(3) 참조 무결성(Referential integrity)
- 외래키(FK) 제약, 릴레이션간의 참조 관계를 선언하는 제약조건
- 일반적으로 참조되는 릴레이션을 부모 릴레이션, 참조하는 릴레이션을 자식 릴레이션이라고 한다.
무결성 삭제시 주의할점 FK삭제후 PK삭제할것 이유는 : PK값을 받아서 사용하기 때문에
1. PRIMARY KEY(기본키) : PK
2. NOT NULL
3. UNIQUE
4. DEFAULT
5. CHECK
6. FOREIGN KEY(외래키) : FK
[1] 테이블 생성!!
DROP TABLE PYMEM; --테이블 지우기
CREATE TABLE PYMEM(
PY_CODE NVARCHAR2(5) PRIMARY KEY, --PK지정방법(1)
PY_NAME NVARCHAR2(5) DEFAULT 'USER1',
PY_PASSWORD NUMBER(4) NOT NULL CHECK(LENGTH(PY_PASSWORD)>=3),
PY_PHONE NVARCHAR2(11)UNIQUE
-- CONSTRAINT PY_CODE_PK PRIMARY KEY(PY_CODE) -- PK 지정방법(2)
);
SELECT * FROM PYMEM; --테이블 확인
-- PK 지정방법(3)
ALTER TABLE [TABLE_NAME]
ADD CONSTRAINT {CONST(제약조건 이름)_NAME]
PRIMARY KEY([COL_NAME]);
-- PY_CODE를 기본키로(PK) 지정 (3번 예)
ALTER TABLE PYMEM
ADD CONSTRAINT PY_CODE_PK
PRIMARY KEY(PY_CODE);
--PY_CODE를 기본키로(PK) 지우기
ALTER TABLE PYMEM
DROP CONSTRAINT PY_CODE_PK;
--테이블 제약조건 확인!
SELECT * FROM USER_CONSTRAINTS;
-- OWNER : 제약조건 소유 계정
-- CONSTRAINT_NAME : 제약조건의 이름
-- CONSTRAINT_TYPE : 제약조건 타입
-- P : PRIMARY KEY(기본키)
-- R : FOREIGN KEY(외래키)
-- C : CHECK, NOT NULL
-- U : UNIQUE
-- TABLE_NAME : 제약조건이 걸려있는 테이블
-- BINS 테이블 삭제
PURGE RECYCLEBIN;
INSERT INTO PYMEM(PY_CODE, PY_PASSWORD, PY_PHONE) VALUES('PY001', 1111, '01012345578');
INSERT INTO PYMEM VALUES('PY002', '둘리엄마', 2222, NULL);
INSERT INTO PYMEM VALUES('PY003', '둘리아빠', 3333, '01012345668');
INSERT INTO PYMEM VALUES('PY004', '둘리누나', 4444, '01012345678');
SQL하면서 이런 오류를 많이 볼수 있다

이런땐 TABLE를 만들어 주면 된당!!




PRIMART KEY(기본키)
: 하나의 테이블에서 레코드를 구분 지을 수 있는 특정 컬럼의 유일값
: NOT NULL + UNIQUE
ex) 주민번호(SSN), 학생번호(STU_CODE), 아이디(MEM_ID)
NOT NULL
: 하나의 테이블에서 특정 컬럼의 값을 반드시 입력해야 하는 제약조건
: NULL값을 허용하지 않는다.
UNIQUE
: 하나의 테이블에서 특정 컬럼의 값이 중복되는 것을 방지하는 제약조건
: 단, NULL값은 무제한 허용 NULL--값이 없다는 뜻
-- NOT NULL ( 따로 이렁게 지정해도 되지만 직접 테이블 선언할때 넣어 주는것이 이해하기 좋다)
ALTER TABLE PYMEM
MODIFY PY_PASSWORD NOT NULL;
-- UNIQUE
ALTER TABLE PYMEM
MODIFY PY_PHONE UNIQUE;
NOT NULL
- NULL 비허용
- 중복값 허용
NOT NULL 제약 조건은 CREATE 문으로 테이블을 생성할 때나, 나중에 ALTER 문으로 추가할 수도 있습니다.
CREATE TABLE Test
(
ID INT NOT NULL,
Name VARCHAR(30),
ReserveDate DATE,
RoomNum INT
);
UNIQUE
- NULL 허용
- 중복값 비허용
아래 두 문법은 모두 해당 필드에 UNIQUE 제약 조건을 설정합니다.
이때 두 번째 문법을 사용하면, 해당 제약 조건에 이름을 설정할 수 있습니다.
CREATE TABLE 테이블이름
(
필드이름 필드타입,
...,
[CONSTRAINT 제약조건이름] UNIQUE (필드이름) -- 뒤에 따로 추가. 이름 설정 가능
)
PRIMARY KEY
- NULL 비허용
- 중복값 비허용
- 테이블당 하나
아래의 두 문법은 모두 해당 필드에 PRIMARY KEY 제약 조건을 설정합니다.
이때 두 번째 문법을 사용하면, 해당 제약 조건에 이름을 설정할 수 있습니다.
CREATE TABLE 테이블이름
(
필드이름 필드타입,
...,
[CONSTRAINT 제약조건이름] PRIMARY KEY (필드이름)
)
FOREIGN KEY
- FOREIGN KEY 제약 조건을 설정한 필드는 외래 키라고 부르며,
- 한 테이블을 다른 테이블과 연결해주는 역할을 합니다.
FOREIGN KEY 제약 조건을 설정할 때 참조되는 테이블의 필드는 반드시 UNIQUE나 PRIMARY KEY 제약 조건이 설정되어 있어야 합니다.
Tip
외래키는 설정할 필드가 기본키나 유니크가 아니면 생성이 제약됩니다.
CREATE TABLE 테이블이름
(
필드이름 필드타입,
...,
[CONSTRAINT 제약조건이름] FOREIGN KEY (필드이름) REFERENCES 테이블이름2 (필드이름)
)
위의 문법을 사용하면 해당 필드에 FOREIGN KEY 제약 조건을 설정합니다.
이때 참조되는 테이블의 이름은 REFERENCES 키워드 다음에 명시됩니다.
CREATE TABLE Test2
(
ID INT,
ParentID INT,
FOREIGN KEY (ParentID) REFERENCES Test1(ID) ON UPDATE CASCADE
);
위의 예제에서 Test2 테이블의 ParentID 필드는 Test1 테이블의 ID 필드를 참조하도록 설정됩니다.
따라서 Test1 테이블의 ID 필드가 변경되면, 같은 값의 Test2 테이블의 ParentID 필드도 같이 변경됩니다.
DEFAULT
- DEFAULT 제약 조건은 해당 필드의 기본값을 설정할 수 있게 해줍니다.
만약 레코드를 입력할 때 해당 필드 값을 전달하지 않으면, 자동으로 설정된 기본값을 저장합니다.
CREATE TABLE 테이블이름
(
필드이름 필드타입 DEFAULT 기본값,
...
)