* PRIMARY KEY(기본키) 제약조건 => PK
테이블에서 각 행들을 식별하기 위해 사용될 컬럼에 부여하는 제약조건 (식별자의 역할)
EX) 회원번호, 학번, 사원번호, 부서코드, 직급코드, 주문번호, 예약번호, 운송장번호
PRIMARY KEY 제약조건을 부여하면 그 컬럼에 자동으로 NOT NULL + UNIQUE 제약조건 가진다.
* 유의사항 : 한 테이블당 오로지 !!! 한개만 가능
CREATE TABLE MEM_PRI(
MEM_NO NUMBER CONSTRAINT MEMNO_PK PRIMARY KEY,
MEM_ID VARCHAR2(20) NOT NULL UNIQUE,
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3) CHECK (GENDER IN('남', '여')),
PHONE VARCHAR2(13),
EMAIL VARCHAR2(50)
-- CONSTRAINT MEMNO_PK PRIMARY KEY(MEM_NO)
);
INSERT INTO MEM_PRI
VALUES(1, 'user01', 'pass01', '손흥민', '남', '010-1111-2222', NULL);
INSERT INTO MEM_PRI
VALUES(1, 'user02', 'pass02', '이강인', '남', NULL, NULL);
-- ORA-00001: unique constraint (DDL.MEMNO_PK) violated
-- 기본키에 중복값을 담으려고 할 때(UNIQUE 제약조건 위반)
INSERT INTO MEM_PRI
VALUES(NULL, 'user02', 'pass02', '이강인', '남', NULL, NULL);
-- ORA-01400: cannot insert NULL into ("DDL"."MEM_PRI"."MEM_NO")
-- 기본키에 NULL을 담으려 할 때 (NOT NULL 제약조건에 위배됨)
CREATE TABLE MEM_PRI2(
MEM_NO NUMBER CONSTRAINT MEMNO_PK PRIMARY KEY,
MEM_ID VARCHAR2(20) PRIMARY KEY,
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3) CHECK (GENDER IN('남', '여')),
PHONE VARCHAR2(13),
EMAIL VARCHAR2(50)
-- CONSTRAINT MEMNO_PK PRIMARY KEY(MEM_NO)
);
-- ORA-02260: table can have only one primary key
-- 기본키 하나만 된다.
두개 이상의 컬럼을 묶어서 기본키로 지정하는 방법(복합키)
CREATE TABLE MEM_PRI2(
MEM_NO NUMBER,
MEM_ID VARCHAR2(20),
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3) CHECK (GENDER IN('남', '여')),
PHONE VARCHAR2(13),
EMAIL VARCHAR2(50),
PRIMARY KEY(MEM_NO, MEM_ID) -- 묶어서 PRIMARY KEY 제약 조건 부여(복합키)
);
INSERT INTO MEM_PRI2
VALUES(1, 'user01', 'pass01', '손흥민', null, null, null);
INSERT INTO MEM_PRI2
VALUES(1, 'user02', 'pass02', '이강인', null, null, null);
INSERT INTO MEM_PRI2
VALUES(2, 'user02', 'pass02', '이승우', null, null, null);
INSERT INTO MEM_PRI2
VALUES(NULL, 'user02', 'pass02', '이강인', null, null, null);
-- ORA-01400: cannot insert NULL into ("DDL"."MEM_PRI2"."MEM_NO")
-- PRIMARY KEY로 묶여있는 각 컬럼에는 절대 NULL을 허용하지는 않음!!
복합키 사용 예시 (찜하기, 좋아요, 구독)
-- 찜하기 : 한 상품은 오로지 한번만 찜할 수 있음
-- 어떤 회원이 어떤 상품을 찜하는지에 대한 데이터를 보관하는 테이블
CREATE TABLE TB_LIKE(
MEM_NO NUMBER,
PRODUCT_NAME VARCHAR2(30),
LIKE_DATE DATE,
PRIMARY KEY(MEM_NO, PRODUCT_NAME)
);
INSERT INTO TB_LIKE VALUES(1, '감자', SYSDATE); -- 1번 회원이 감자 찜
INSERT INTO TB_LIKE VALUES(1, '고구마', SYSDATE); -- 2번 회원이 고구마 찜
INSERT INTO TB_LIKE VALUES(1, '감자', SYSDATE); -- 에러발생 !! 한번만 찜해야됨
INSERT INTO TB_LIKE VALUES(2, '감자', SYSDATE); -- 2번 회원이 감자 찜