IT코딩공부!

#16 !CONSTRAINT(제약조건)!

history. 2023. 4. 11. 15:58

오늘의 노래!!!

 
Kitsch
아티스트
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 기본값,
  ...
)