Programming/SQL

[Oracle] USER_TABLES / USER_TAB_COLUMNS / INSERT문 / 제약조건(CONSTRAINTS) - NOT NULL, UNIQUE

Jayna. 2024. 2. 23. 16:52
728x90

 

 

[Oracle] DDL(데이터 정의 언어) / 테이블 생성하기(CREATE TABLE) / COMMENT ON COLUMN /자료형

DDL(DATA DEFINITION LANGUAGE) : 데이터 정의 언어 오라클에서 제공하는 객체(OBJECT)를 새로 만들고(CREATE), 구조를 변경하고(ALTER), 구조자체를 삭제(DROP)하는 명령문. 오라클에서의 객체(구조) 테이블(TABLE)

jaynarecord.tistory.com

 

데이터 딕셔너리 

다양한 객체들의정보를 저장하고 있는 시스템 테이블

 

USER_TABLES

현재 이 계정이 가지고 있는 테이블들의 전반적인 구조를 확인할 수 있는 데이터

SELECT * FROM USER_TABLES;

 

USER_TAB_COLUMNS

모든 컬럼을 확인할 수 있는 데이터

SELECT * FROM USER_TAB_COLUMNS

 

 

INSERT

데이터를 추가할 수 있는 구문. 한 행으로 추가되며 값의 순서가 중요하다

-- 1)
INSERT INTO 테이블명 
VALUES (컬럼값1, 컬럼값2, ... )

-- 2)
INSERT INTO 테이블명(컬럼명1, 컬럼명2, ...)
VALUES (값1, 값2, ...)
/*
INSERT INTO MEMBER(MEMBER_ID, MEMBER_PWD, MEMBER_NAME, MEMBER_DATE)
VALUES ('user01', 'pass01', '홍길동', '2021-02-01');
*/
INSERT INTO MEMBER VALUES ('user01', 'pass01', '홍길동', '2021-02-01');
-- 1행이(가) 삽입되었습니다.
INSERT INTO MEMBER VALUES ('user02', 'pass02', '김길동', SYSDATE);
INSERT INTO MEMBER VALUES ('user03', 'pass03', '이길동', '21/02/02');
INSERT INTO MEMBER VALUES (NULL, NULL, NULL, SYSDATE);
-- 아이디, 비밀번호, 이름이 NULL값으로 들어감
INSERT INTO MEMBER VALUES ('user03', 'pass03', '박길동', SYSDATE);
-- 중복값 입력 가능함

-- => NULL값이나 중복된 값은 유효하지 않은 값들이므로, 
-- 유효한 데이터값을 유지하기 위해서는 제약조건을 걸어줘야 한다
728x90

제약 조건 CONSTRAINTS

- NOT NULL, UNIQUE, CHECK, PRIMARY KEY, FOREIGN KEY

- 원하는 데이터값만을 유지하기 위해서(보관하기 위해서) 특정 컬럼마다 설정하는 제약

- 제약조건이 부여된 컬럼에 들어올 데이터에 문제가 없는지 자동으로 검사할 목적

- 컬럼에 제약조건을 부여하는 방식

 1) 컬럼 레벨: 컬럼명 자료형 제약조건 => 제약조건을 부여하고자 하는 컬럼 뒤에 기술

 2) 테이블레벨

 

NOT NULL

- 해당 컬럼에 반드시 값이 존재해야할 경우에 사용.

(NULL 값이 절대 들어와서는 안되는 컬럼)

- 삽입/수정시 NULL값을 허용하지 않도록 제한

NOT NULL 제약조건은 컬럼레벨 방식 밖에 안됨

CREATE TABLE MEM_NOTNULL(
     MEM_NO NUMBER NOT NULL,
     MEM_ID VARCHAR2(20) NOT NULL,
     MEM_PWD VARCHAR2(20) NOT NULL,
     MEM_NAME VARCHAR2(20) NOT NULL,
     GENDER CHAR(3),
     PHONE VARCHAR2(15),
     EMAIL VARCHAR2(30)
);

INSERT INTO MEM_NOTNULL
VALUES (2, NULL, NULL, NULL, NULL, NULL, NULL);
-- NOT NULL 제약조건에 위배되어 오류발생
-- ORA-01400 : cannot insert NULL into ("DDL"."MEM_NOTNULL"."MEM_ID")

INSERT INTO MEM_NOTNULL
VALUES (1, 'user01','pass01', '홍길동', '남', '010-1234-4321', 'hgd@email.com');
INSERT INTO MEM_NOTNULL
VALUES (2, 'user02','pass02', '김길동', NULL, NULL, NULL);
-- NOT NULL 제약조건이 부여되어있는 컬럼에는 반드시 값이 존재해야 함
INSERT INTO MEM_NOTNULL
VALUES (3, 'user01','pass03', '박길동', '남', NULL, NULL);
-- 중복값에 대한 제약조건은 걸지 않았기 때문에 중복값은 입력됨

UNIQUE 

 - 컬럼에 중복값을 제한하는 제약조건

 - 삽입/수정시 기존에 해당 컬럼값 중 중복값이 있을 경우, 추가 또는 수정이 되지 않게 제약

 * UNIQUE 제약조건은 컬럼레벨/테이블레벨 방식 둘다 가능.

CREATE TABLE MEM_UNIQUE(
     MEM_NO NUMBER NOT NULL,
     MEM_ID VARCHAR2(20) NOT NULL UNIQUE,  -- 컬럼레벨 방식
     MEM_PWD VARCHAR2(20) NOT NULL,
     MEM_NAME VARCHAR2(20) NOT NULL,
     GENDER CHAR(3),
     PHONE VARCHAR2(15),
     EMAIL VARCHAR2(30)
);

-- DROP TABLE : 테이블 삭제
DROP TABLE MEM_UNIQUE; --Table MEM_UNIQUE이(가) 삭제되었습니다.

CREATE TABLE MEM_UNIQUE(
     MEM_NO NUMBER NOT NULL,
     MEM_ID VARCHAR2(20) NOT NULL, 
     MEM_PWD VARCHAR2(20) NOT NULL,
     MEM_NAME VARCHAR2(20) NOT NULL,
     GENDER CHAR(3),
     PHONE VARCHAR2(15),
     EMAIL VARCHAR2(30),
     UNIQUE (MEM_ID)      -- 테이블레벨 방식
);
INSERT INTO MEM_UNIQUE VALUES(1, 'user01', 'pass01', '홍길동', '남', NULL, NULL);
INSERT INTO MEM_UNIQUE VALUES(2, 'user02', 'pass02', '이길동', '남', NULL, NULL);
INSERT INTO MEM_UNIQUE VALUES(3, 'user02', 'pass03', '김길동', NULL, NULL, NULL);
-- UNIQUE 제약 조건에 위배되어 오류 발생
-- ORA-00001: unique constraint (DDL.SYS_C007040) violated
-- 오류 구문으로 제약조건명을 알려주지만 (unique constraint) 어떤 컬럼에 문제가 있는지
-- 컬럼명을 알려주지는 않으므로 제약조건을 모르면 파악하기 어려움(ORA-00001: unique constraint)
-- 제약조건명을 지정해줄 수 있다.

 

>> 제약조건 부여시 제약조건명도 같이 지정하는 표현방법

1) 컬럼레벨 방식

CREATE TABLE 테이블명(
     컬럼명 자료형 CONSTRAINT 제약조건명 제약조건,
     컬럼명 자료형,
     ...
 );

 

2) 테이블레벨 방식

CREATE TABLE 테이블명(
      컬럼명 자료형,
      컬럼명 자료형,
      ...
      CONSTRAINT 제약조건명 제약조건 (컬럼명)
 );
CREATE TABLE MEM_CON_NM(
      MEM_NO NUMBER NOT NULL,
      MEM_ID VARCHAR2(20) NOT NULL,
      MEM_PWD VARCHAR2(20) NOT NULL,
      MEM_NAME VARCHAR2(20) CONSTRAINT MEM_NAME_NN NOT NULL,  -- 컬럼레벨 방식
      GENDER CHAR(3),
      PHONE VARCHAR2(15),
      EMAIL VARCHAR2(30),
      CONSTRAINT MEM_ID_UQ UNIQUE (MEM_ID)                    -- 테이블레벨 방식
);
 
INSERT INTO MEM_CON_NM VALUES (1, 'user01', 'pass01', '홍길동', NULL, NULL, NULL);
INSERT INTO MEM_CON_NM VALUES (2, 'user01', 'pass02', '김길동', NULL, NULL, NULL);
-- 오류: ORA-00001: unique constraint (DDL.MEM_ID_UQ) violated
--                => MEM_ID_UQ 제약조건명을 알려줌

 

 

 

 

[Oracle] 제약조건(CONSTRAINTS) - CHECK/PRIMARY KEY(기본키)

CHECK 컬럼에 기록될 수 있는 값에 대한 조건을 설정해둘 수 있다. CHECK (조건식) CREATE TABLE MEM_CHECK( MEM_NO NUMBER NOT NULL, MEM_ID VARCHAR2(20) NOT NULL, MEM_PWD VARCHAR2(20) NOT NULL, MEM_NAME VARCHAR2(20) NOT NULL, GENDER CHAR

jaynarecord.tistory.com

 

728x90