CREATE TABLE 테이블명(
컬럼명 자료형 [제약조건],
...
);
1) 제약 조건은 테이블의 특정 열에 지정
2) 제약 조건을 지정한 열에 제약 조건에 부합하지 않는 데이터를 저장할 수 없습니다.
3) 제약 조건 지정 방식에 따라 기존 데이터의 수정이나 삭제 가능 여부도 영향을 받습니다.
1) NOT NULL: NULL을 허용하지 않음, 반드시 값을 입력해야 할때(필수항목)
2) UNIQUE: 중복 X, NULL은 중복 허용
3) PRIMARY KEY: 기본키, 중복X, NULL허용 X
4) FOREIGN KEY: 다른 테이블의 기본키를 참조하는 키, 참조 무결성 제약조건
부모 레코드에 자식 레코드가 있는 경우 부모 레코드 삭제 불가
👩🏫참고
JOIN시 외래키가 꼭 될 필요는 X, 공통적인 테이블간의 값을 통해서만 조인
5) CHECK: 조건(비교조건...)에 따른 데이터 입력 통제
1) 데이터베이스에 저장되는 데이터의 정확성과 일관성을 보장한다는 의미
2) 종류
CREATE TABLE MEMBER(
USER_ID VARCHAR2(30) NOT NULL,
USER_PW VARCHAR2(65) NOT NULL,
USER_NM VARCHAR2(30) NOT NULL,
MOBILE VARCHAR2(15)
);
INSERT INTO MEMBER (USER_ID, USER_PW, USER_NM)
VALUES ('USER01','1234','사용자01');
SELECT * FROM MEMBER;

1) USER_CONSTRAINTS 데이터 사전을 활용
SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME='MEMBER';

CONSTRAINT_TYPE
C: 일반적인 제약조건, NOT NULL, CHECK
P: Primary Key, 기본키
R: Foreign Key, 외래키
U: Unique
컬럼명 자료형 CONSTRAINT 제약조건명 제약조건
테이블명_컬럼명_제약조건종류
CREATE TABLE MEMBER(
USER_ID VARCHAR2(30) CONSTRAINT MEM_USER_ID_NN NOT NULL,
USER_PW VARCHAR2(65) CONSTRAINT MEM_USER_PW_NN NOT NULL,
USER_NM VARCHAR2(40) CONSTRAINT MEM_USER_NM_NN NOT NULL,
MOBILE VARCHAR2(15)
);
SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME ='MEMBER';


1) NOT NULL 제약 조건의 추가는 ALTER 명령어와 MODIFY 키워드를 사용
ALTER TABLE 테이블명 MODIFY 컬럼명 [자료형][제약조건]
2) TEL 열에 NOT NULL 제약 조건 추가하기
3) TEL 열 데이터 수정하기
4) NOT NULL 제약조건 추가하기


ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명;
ALTER TABLE MEMBER DROP CONSTRAINT MEM_MOBILE_NN;
1) 열에 저장할 데이터의 중복을 허용하지 않고자 할 때 사용
2) NULL은 값이 존재하지 않음을 의미하기 때문에 중복 대상에서는 제외됩니다.
3) UNIQUE 지정 방법은 NOT NULL 제약 조건과 동일합니다.
CREATE TABLE MEMBER(
USER_ID VARCHAR2(30) CONSTRAINT MEM_USER_ID_UQ UNIQUE,
USER_PW VARCHAR2(65),
MOBILE VARCHAR2(15)
);

1) TABLE_UNIQUE 테이블에 데이터 중복하여 입력하기


USER_ID VARCHAR2(30) CONSTRAINT MEM_USER_ID_UQ UNIQUE,
ALTER TABLE 테이블명 MODIFY 컬럼명 CONSTRAINT 제약조건이름 UNIQUE;
ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건이름;

ALTER TABLE MEMBER DROP CONSTRAINT MEM_USER_ID_UQ;
여러 컬럼 묶어서 제약조건 지정하기

USER_IND_COLUMNS: 인덱스 포함, 제약조건 적용 컬럼 정보

1) UNIQUE와 NOT NULL 제약 조건의 특성을 모두 가지는 제약 조건(데이터 중복을 허용하지 않고 NULL도 허용하지 않습니다.)
2) NULL이 아닌 유일한 값을 가지므로 테이블의 각 행을 식별하는 데 활용
3) PRIMARY KEY 제약 조건은 테이블에 하나밖에 지정할 수 없습니다.
4) PRIMARY KEY로 지정하면 해당 열에는 자동으로 인덱스가 만들어집니다.
1) 테이블을 생성할 때 특정 열에 PRIMARY KEY 설정하기
2) 생성한 PRIMARY KEY 확인하기
3) 생성한 PRIMARY KEY를 통해 자동 생성된 INDEX 확인하기
CREATE TABLE MEMBER(
USER_ID VARCHAR2(30) CONSTRAINT MEM_USER_ID_PK PRIMARY KEY,
USER_PW VARCHAR2(65),
MOBILE VARCHAR2(15),
);
CREATE TABLE MEMBER(
USER_ID VARCHAR2(30),
USER_PW VARCHAR2(65),
MOBILE VARCHAR2(15)
CONSTRAINT MEM_USER_ID_PW_PK PRIMARY KEY(USER_ID,USER_PW); --여러 컬럼 결합한 기본키
--USER_ID,USER_PW이 중복X, NULL값 X
);


대리키로 기본키를 지정
-- 대리키로 기본키 지정
CREATE SEQUENCE SEQ_MEMBER;
CREATE TABLE MEMBER(
USER_NO NUMBER(10) PRIMARY KEY,
USER_ID VARCHAR2(30) UNIQUE NOT NULL, --제약조건 2개 UNIQUE & NOT NULL
USER_PW VARCHAR2(65) NOT NULL,
USER_NM VARCHAR2(40) NOT NULL,
MOBILE VARCHAR2(15)
);
INSERT INTO MEMBER
VALUES(SEQ_MEMBER.NEXTVAL, 'USER01','1234','사용자01','010-1111-2222');
1) 서로 다른 테이블 간 관계를 정의하는 데 사용하는 제약 조건
2) 특정 테이블에서 PRIMARY KEY 제약 조건을 지정한 열을 다른 테이블의 특정 열에서 참조하겠다는 의미로 지정

외래키 제약조건이 걸려있다.
#1.
CREATE TABLE 테이블명{
...
컬럼명 자료형 CONSTRAINT 제약조건이름 REFERENCES 참조 테이블(참조할 컬럼)
}
2.
CREATE TABLE 테이블명{
...
컬럼명 자료형,
CONSTRAINT 제약조건이름 FOREIGN KEY(현재테이블의 컬럼명)
REFERENCES 참조 테이블(참조할 컬럼)
}
CREATE TABLE DEPT_FK AS SELECT * FROM DEPT;
ALTER TABLE DEPT_FK ADD CONSTRAINT DEPT_FK_PK
PRIMARY KEY(DEPTNO);
CREATE TABLE EMP_FK (
EMPNO NUMBER(4) CONSTRAINT EMP_FK_PK PRIMARY KEY,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2),
CONSTRAINT EMP_FK_FK
FOREIGN KEY(DEPTNO) REFERENCES DEPT_FK(DEPTNO)
-- DEPTNO NUMBER(2) CONSTRAINT EMP_FK_FK REFERENCES DEPT_FK(DEPTNO)
);

ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건이름 FOREGIN KEY(현재 테이블의 컬럼명)
REFERENCES 참조테이블(참조할 컬럼명)
👩🏫참고
ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건 이름 PRIMARY KEY(컬럼명, ...);
ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명;
ON DELETE
--제약조건 삭제
ALTER TABLE EMP_FK DROP CONSTRAINT EMP_FK_FK;
ALTER TABLE EMP_FK ADD CONSTRAINT EMP_FK_FK
FOREIGN KEY(DEPTNO) REFERENCES DEPT_FK(DEPTNO)
ON DELETE CASCADE;
--부모가 삭제되면 자식도 연쇄삭제
SELECT * FROM EMP_FK; --외래키가 있는 쪽이 자식 레코드
SELECT * FROM DEPT_FK; -- 기본키가 제공되는 쪽이 부모 레코드

제약 조건 비활성화, 활성화