Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 데이터베이스
- 티모장인
- 데이터베이스 UPDATE
- 데이터베이스 예제
- 오라클
- 자바입문
- 데이터베이스기초
- 오라클UPDATE
- 개발자준비
- 슬림3
- 데이터베이스 집합연산자
- 사무용 노트북
- lenovo ideapad 3
- 레노버 아이디어패드 슬림3
- 데이터베이스 기초
- 코린이
- 레노버 슬림3
- 레노버 노트북
- 코딩일기
- 자바초보
- 오라클 DELETE
- 탑마이장인
- 가성비 노트북
- 데이터베이스 DELETE
- 라이젠노트북
- SQL
- 데이터베이스 JOIN
- 코딩입문
- IdeaPad 3 15ABA7
- 코딩초보자
Archives
- Today
- Total
스퐁지송 개발노트
데이터베이스 오라클 제약 조건 본문
728x90
제약조건
데이터에 제약조건을 걸어서 옮지않은 데이터가 입력되는걸 방지
데이터의 무결성을 유지하기 위함
무결성 : 데이터의 정확성,일관성을 보장
영역 무결성 - 컬럼에 저장되는 데이터가 적정 데이터인지 확인
NULL,조건범위에 해당하는 값 만족하는 데이터
참조 무결성 - 기본키를 참조하는 외래키에는 기본키에 해당하는 데이터만 저장
개체 무결성 - 데이터를 유일하게 식별해주는 기본키는 반드시 값이 있어야하고,
NULL 안되고, 중복도 불가능하다
NOT NULL (데이터추가 NULL불가능)
CREATE TABLE NULL_TEST (
ID VARCHAR(20) NOT NULL, --NULL 안됨
PW VARCHAR(20) NOT NULL, --NULL 안됨
NAME VARCHAR(20)
);
SELECT * FROM NULL_TEST;
INSERT INTO NULL_TEST
VALUES('TEEMO','1234','캡틴티모');
INSERT INTO NULL_TEST
VALUES (NULL,'1234','티모');
-- ID부분이 NULL 이기때문에 실행안됨
INSERT INTO NULL_TEST
VALUES('TEEMO','1234',NULL);
--NAME 부분은 NOT NULL 처리를 하지않아 정상적으로 추가됨
UPDATE NULL_TEST SET ID = NULL;
--정보 수정도 NULL로 불가능
CONSTRAINT
: 제약조건 직접 입력
CONSTRAINT 제약조건이름(본인이 아무거나 설정) 설정할제약조건
기본형식
테이블 생성
CREATE TABLE 테이블명 (
컬럼명 데이터형식 NOT NULL --오라클이 알아서 제약조건이름을 설정
컬럼명 데이터형식 CONSTRAINT 제약조건명 NOT NULL
);
제약조건 삭제
ALTER TABLE 테이블명
DROP CONSTRANINT 제약조건
이미 생성된 테이블에 제약조건을 추가
(데이터가 없으면 괜찮으나 추가할 제약조건에 위배되는 데이터가 있으면 불가능)->데이터삭제로 해결해야함
ALTER TABLE 테이블명
MODIFY 컬럼명 NOT NULL; --제약조건이름은 오라클이 알아서 지정
(제약조건걸린 테이블 생성)
CREATE TABLE NULL_TEST2(
ID VARCHAR(20) CONSTRAINT ID_NULL NOT NULL,
--제약조건 직접입력 ID_NULL은 뒤에 적힌 제약조건의 속성을 가지게된다
PW VARCHAR(20)
);
(테이블에 제약조건에 위배되지않는 데이터 넣기)
INSERT INTO NULL_TEST2
VALUES('TEEMO',NULL);
--PW에는 NOT NULL 처리를 하지않아 추가됨
(PW컬럼에 추가로 제약조건 걸기)
ALTER TABLE NULL_TEST2
MODIFY PW NOT NULL;
--PW에 NOT NULL 데이터 추가 하지만 이미 VALUES('TEEMO',NULL); 값이 있어 추가안됨
(제약조건이 안걸리는 이유 : 제약조건에 위배되는 데이터가 있으므로 해결해야함)
DELETE FROM NULL_TEST2; --그래서 데이터 모두 삭제
--데이터 모두 삭제후
ALTER TABLE NULL_TEST2
MODIFY PW NOT NULL;
--실행시 정상적으로 제약조건 걸림
ALTER TABLE NULL_TEST2
DROP CONSTRAINT ID_NULL;
--아까 직접작성한 ID_NULL 제약조건을 지움
INSERT INTO NULL_TEST2
VALUES(NULL,'1234');
-- ID에 걸린 NOT NULL 속성의 ID_NULL의 제약조건이 사라져서 정상작동
DELETE FROM NULL_TEST2 WHERE 위배되는 컬럼을 지정;
--이렇게 지우면 모든 데이터를 지우지않아도 된다
CREATE TABLE NULL_TEST(
ID VARCHAR(50) NOT NULL,--제약조건 이름은 오라클이 자동을 설정
PW VARCHAR(50) CONSTRAINT PW_NULL NOT NULL,--제약조건이름은 PW_NULL
NAME VARCHAR(50) --제약조건없음
);
--제약조건에 위배되는 데이터가 없으므로 잘 실행됨
INSERT INTO NULL_TEST
VALUES('캡틴티모','1234',NULL);
--ID에 설정된 제약조건에 위배되므로 실행이 안됨
INSERT INTO NULL_TEST
VALUES(NULL,'1234','티모');
--PW에 설정된 제약조건이 위배되므로 실행이 안됨
INSERT INTO NULL_TEST
VALUES('캡틴티모',NULL,'티모');
--이미 생성된 테이블안에 제약조건 추가
--이미 입력된 데이터 중 NAME에 NULL이 존재하므로 제약조건 추가 불가능
ALTER TABLE NULL_TEST
MODIFY NAME NOT NULL; --제약조건 이름은 오라클이 자동으로 설정
--참고사항
ALTER TABLE NULL_TEST
MODIFY NAME CONSTRAINT NAME_NULL NOT NULL;
--제약조건이름은 NAME_NULL로 설정
--확인해보면 NAME에 NULL이 있어서 위에 코드가 실행안됨
SELECT * FROM NULL_TEST;
--NAME에 NOT NULL을 추가하기 위해선 기존 입력된 데이터 중 NULL인걸 삭제해야함
--그래서 NAME이 NULL인 데이터를 삭제함
DELETE FROM NULL_TEST WHERE NAME IS NULL;
--삭제 후 제약조건을 추가하면 잘 추가 됨
ALTER TABLE NULL_TEST
MODIFY NAME CONSTRAINT NAME_NULL NOT NULL;
--제약조건 이름은 NAME_NULL임
--삭제 후 제약조건을 추가하면 잘 추가 됨(실행이 안되면 잘 추가된것)
INSERT INTO NULL_TEST
VALUES('캡틴티모','1212',NULL);
--현재 3개의 컬럼에 모두 NOT NULL 설정이 되어있으므로 추가는 무족건 다 입력해야함
--(잘실행되어야함)
INSERT INTO NULL_TEST
VALUES('캡틴티모','1234','TEEMO');
--생각해보니 NAME에는 NOT NULL일 필요가 없을거 같음
--그래서 제약조건 삭제시킬거임
ALTER TABLE NULL_TEST
DROP CONSTRAINT NAME_NULL; --제약조건 이름이 NAME_NULL인것을 삭제
--위에 NAME제약조건을 지웠으므로 이제 이름에 NULL이 추가됨
INSERT INTO NULL_TEST
VALUES('캡틴티모','1234',NULL);
--NULL추가 된건지 최종확인
SELECT * FROM NULL_TEST;
ROLLBACK;
UNIQUE
:중복 불가능
기본형식
CREATE TABLE UNIQUE_TEST(
ID VARCHAR(20) UNIQUE,
PW VARCHAR(20)
);
돌아가는 과정
--UNIQUE : 중복 불가능
CREATE TABLE UNIQUE_TEST(
ID VARCHAR(20) UNIQUE,
PW VARCHAR(20)
);
--데이터 추가
INSERT INTO UNIQUE_TEST
VALUES('마이','1111');
--ID가 중복되는 데이터를 추가하려함 (안되는게 정상)
INSERT INTO UNIQUE_TEST
VALUES('마이','2222'); --제약조선(중복불가능)UNIQUE를 ID에 설정했기때문
--UNIQUE는 NULL 가능
INSERT INTO UNIQUE_TEST
VALUES(NULL,'3333');
--NULL이 추가된거 확인
SELECT * FROM UNIQUE_TEST;
--근데 NULL데이터 ID를 추가하면???
INSERT INTO UNIQUE_TEST
VALUES(NULL,'4444');
--확인해보면 중복으로 들어감
SELECT * FROM UNIQUE_TEST;
--이유: NULL은 값이 없다는 뜻이므로 UNIQUE랑은 상관이 없음.
--걍 데이터 추가함 (기존에 입력된 PW와 겹치는걸로 넣음)
INSERT INTO unique_test
VALUES('애쉬','1111');
--데이터 추가된거 확인
SELECT * FROM UNIQUE_TEST;
--PW에 제약조건(UNIQUE)를 추가
--(PW가 이미 중복된 데이터가 있으므로 실행안됨)
ALTER TABLE UNIQUE_TEST
MODIFY PW UNIQUE;
--중복되는 데이터를 지움
DELETE FROM UNIQUE_TEST WHERE ID = '마이';
--중복된 데이터를 지웠고 다시 제약조건을 추가해봄
--중복된 PW 데이터가 없으므로 잘 실행됨
ALTER TABLE UNIQUE_TEST
MODIFY PW UNIQUE;
--PW에 제약조건이 잘 설정된지 확인
--기존 PW와 중복된 데이터를 추가(실행이 안되면 정상)
INSERT INTO UNIQUE_TEST
VALUES('베인','1111');
--생각해보니 PW는 중복되도 괜찮은거같음
--PW의 제약조건을 삭제시키기
ALTER TABLE UNIQUE_TEST
DROP CONSTRAINT SYS_C007015; --제약조건이름을 설정하지않아 모름
--UNIQUE_TEST 테이블을 열어 제약조건의 이름을 찾으면됨(SYS_C007015)
--제약조건 삭제했으니 중복데이터 추가시켜봄(작동되면 정상)
INSERT INTO UNIQUE_TEST
VALUES('베인','1111');
--중복데이터 추가 잘된지 확인
SELECT * FROM UNIQUE_TEST;
PRIMARY KEY
: 각 레코들을 구별해주는 필드, 중복내용 입력 불가능, NULL 불가능
create table pk_test(
id varchar(20) primary key,
pw varchar(20)
);
desc pk_test;
insert into pk_test
values('a','1234');
insert into pk_test
values('a','zxcv');
select*from pk_test2;
--레코드 추가(ID가 기본키으므로 NULL안됨 - 오류)
INSERT INTO PK_TEST
VALUES(NULL,'1234');
외래키 FOREIGN KEY
: 다른 테이블간 관계를 정의할 떄 사용
기본키를 참조
참조하는 기본키의 데이터타입과 일치해야함
--
create table pk_test(
id varchar(20) primary key,
pw varchar(20)
);
CREATE TABLE FK_TEST
ID NUMBER CONSTRAINT FK_ID REFERENCES PK_TEST(ID),
NAME VARCHAR(20)
);
PK_TEST의 ID컬럼의 데이터 타입과
KF_TST의 ID컬럼의 데이터 타입이 다르게 생성 불가
INSERT INTO FK_TEST
VALUES('B','123');
--오류가남
--참조하는 PK에 B라는 데이터가 없으므로 INSERT불가능
--PK테이블을 참조하기 때문에 PK에 있는 데이터로 생성할 수 있다
INSERT INTO FK_TEST
VALUES('a','홍길동');
--참조하는 PK컬럼(ID)에 a가 있으므로 잘 추가가 됨
실사용예제
CHECK
직접 조건을 지정해서 조건에 만족하는 데이터만 입력
DEFAULT
: 데이터를 입력하지 않을 경우 자동으로 입력되는 값을 기본값이라고 함
CREATE TABLE DE_TEST(
이름 VARCHAR(50),
지역 VARCHAR(50) DEFAULT '서울'
--지역 VARCHAR(50) DEFAULT '서울' CONSTRAINT 제약조건이름 DEFAULT '서울'
);
-EX)
--지역을 작성해서 추가하면 입력한 지역으로 추가
INSERT INTO DE_TEST
VALUES('티모', '부산');
--지역을 NULL로 추가해도 기본값이 아닌 NULL로 추가
INSERT INTO DE_TEST
VALUES('베인', NULL);
--지역부분을 추가하지 않고 이름만 추가하면 지역은 기본값으로 처리
INSERT INTO DE_TEST(이름)
VALUES('애쉬');
INSERT INTO DE_TEST(지역)
VALUES('인천');
INSERT INTO DE_TEST(지역)
VALUES('대구');
SELECT * FROM DE_TEST;
--제약조건추가
ALTER TABLE DE_TEST
MODIFY 이름 DEFAULT '이름';
--이미 입력된 데이터는 적용안됨
SELECT * FROM DE_TEST;
--데이터 추가
INSERT INTO DE_TEST(지역)
VALUES('울산');
--추가된 제약조건이 걸림
SELECT * FROM DE_TEST;
정리
모든 제약조건의 형식
DEFAULT 제외
나머지 제약조건은
이미 입력된 데이터가 제약조건에 위배되면 제약조건 추가 안됨\
728x90
'DATABASE' 카테고리의 다른 글
데이터 베이스 커넥션 풀(DBCP) (0) | 2023.02.07 |
---|---|
데이터베이스 오라클 데이터 정의어(CREATE, DROP, ALTER) (0) | 2023.01.13 |
데이터베이스 오라클 UPDATE 데이터 수정문, DELETE 데이터 삭제문 (0) | 2023.01.13 |
데이터베이스 연습하기 예제--집합연산자(UNION ,INTERSECT,MINUS ),JOIN,서브쿼리 (0) | 2023.01.12 |
데이터베이스 집합연산자(UNION ,INTERSECT,MINUS ),JOIN,서브쿼리 (0) | 2023.01.11 |
Comments