본문 바로가기

SQL

[ 5일차 ] 제약조건 종류와 정의, 제약조건 추가&삭제하기, 컬럼형 수정하기, 시퀀스

 

[오라클 교재 329 제약조건]

 

create table user1(

id nchar(10),

name varchar(20)

);

 

insert into user1(id, name) values('ppk','너구리');

 

select * from user1;

 

create table pk_user1(

id nchar(10) primary key, --pk 설정

name varchar(20)

);

 

insert into pk_user1(id, name) values('ppk','너구리');

insert into pk_user1(id, name) values('ppk','너구리'); -- unique(중복) 제약조건 오류가 남 ( 같은 값이 들어와서)

insert into pk_user1(id, name) values('','너구리'); --not null 제약조건 오류

 

create table pk_user2(

id nchar(10) ,

name varchar(20),

primary key (id) -- 마지막행에 pk 설정하기

);

 

insert into pk_user2(id, name) values('ppk','너구리');

insert into pk_user2(id, name) values('ppk','너구리'); -- unique(중복) 제약조건 오류

insert into pk_user2(id, name) values('','너구리'); --not null 제약조건 오류

 

create table pk_user3(

id nchar(10) ,

name varchar(20),

constraint pk_user3_1 primary key (id) -- 마지막행에 pk 제약조건으로 설정하기

);

 

create table pk_user4(

id nchar(10) ,

name varchar(20),

constraint pk_user3_2 primary key (id,name) -- 두가지 컬럼을 합쳐서 pk를 만든다/ 이 경우에는 제약조건으로 추가하는 방법만 가능하다 (이름은 생략가능)

);

 

insert into pk_user4(id, name) values('ppk','너구리1'); --정상실행

insert into pk_user4(id, name) values('ppk','너구리2'); --정상실행

insert into pk_user4(id, name) values('ppk','너구리1'); --유니크제약조건 오류

insert into pk_user4(id, name) values('ppk',''); --not null 제약조건 오류/ 둘중어디에서 null값이 들어가면 안됨

 

create table user11(

id nchar(10),

name varchar(20) not null -- not null 제약조건 설정해주기

);

 

desc user11;

 

insert into user11(id, name) values('ppk','너구리'); --정상실행

insert into user11(id, name) values('ppk',''); -- not null 제약조건 오류

 

create table user11(

id nchar(10),

name varchar(20),

constraint user11_1 not null (id)-- not null 제약조건은 이렇게 설정하지 못함, 칼럼 옆에서 설정해줘야함

);

 

--값을 필수로 받아야 하는 경우에 not null 제약조건을 설정하는 것

 

 

create table fk_user11(

id nchar(10) not null,

name varchar(20) not null,

foreign key(id) references pk_user1(id) --fk 설정해주기 user1의 id를 참조함 / fk는 참조하는 테이블의 pk를 참조해야함 and 참조하는 컬럼 형이 동일해야함

);

 

drop table pk_user1;

drop table fk_user11;

 

create table pk_user1(

id nchar(10) primary key,

name varchar(20)

);

 

create table fk_user11(

id1 nchar(10) not null,

age number(3),

foreign key(id1) references pk_user1(id) --참조하는 컬럼명이 달라도 의미만 동일하면 됨 (id, id1)

);

 

insert into pk_user1(id,name) values('ppk','너구리'); --정상

insert into fk_user11(id1,age) values('ppk','17'); --정상

insert into fk_user11(id1,age) values('ppk2','17'); -- 참조오류발생 (parent key not found 오류)/ id가 없는 값을 넣을 수 없음

insert into pk_user1(id,name) values('ppk2','영심이');

 

select * from fk_user11;

 

 


[교재 338 유니크제약조건]

 

create table uk_user1(

id nchar(10) unique,

name varchar(20)

);

 

insert into uk_user1(id, name) values ('ppk','영심이'); --정상

insert into uk_user1(id, name) values ('ppk','영심이'); --유니크제약조건 오류

insert into uk_user1(id, name) values ('','영심이'); --정상

insert into uk_user1(id, name) values ('','하늘이'); --정상

 

select * from uk_user1;

 

--유니크제약조건 : 중복은 가능하지만 null 값은 안되는 것을 확인할 수 있다

 

create table uk_user2(

id nchar(10) not null unique,

name varchar(20) not null unique

);

 

insert into uk_user2(id, name) values ('ppk','영심이'); --정상

insert into uk_user2(id, name) values ('ppk','영심이'); --유니크제약조건 오류

insert into uk_user2(id, name) values ('','영심이'); --not null 제약조건 오류

insert into uk_user2(id, name) values ('','하늘이'); --not null 제약조건 오류

 

--따라서 not null제약조건과 unique 제약조건을 같이 걸어버리면 pk와 동일한 역할을 하게 되는것이다.

--unique 제약조건을 쓰는 이유가 null값을 받기 위해서 쓰는거기때문에 not null 제약조건과 같이 쓰진 않는다

 


 

[교재 339 체크 제약조건]

 

create table ck_user2(

id nchar(10) not null unique,

loc varchar(20) not null check (loc in('서울','기타'))

);

--check 할 컬럼명을 써주고 어떤걸 체크할건지 in안에 써준다

--입력되는 데이터를 점검하는 기능을 한다

 

insert into ck_user2(id, loc) values ('ppk','서울'); --정상

insert into ck_user2(id, loc) values ('ppk','경기'); --체크제약조건 오류

select * from ck_user2;

 

create table ck_user3(

id nchar(10) not null unique,

loc varchar(20) not null,

check (loc in('서울','기타')) --이 형식으로 더 많이 써주는 편이다

);

 

insert into ck_user3(id, loc) values ('ppk','서울'); --정상

insert into ck_user3(id, loc) values ('ppk','경기'); --체크제약조건 오류

insert into ck_user3(id, loc) values ('young','기타'); --정상

select * from ck_user3;

 

 


 

 

create table default_user1(

id nchar(10),

name varchar(20),

age number(3)

);

 

insert into default_user1(id) values ('young1');

select * from default_user1;

--이름과 나이에 null값이 들어간 것을 확인

 

create table default_user2(

id nchar(10),

name varchar(20) default '서울',

age number(3) default 21

);

 

create table default_user3(

id nchar(10),

name varchar(20) default '서울',

age number(3) default '21' -- 숫자에 작은 따옴표써서 만들어보기

);

 

insert into default_user3(id) values ('young1');

select * from default_user3;

--똑같이 잘 들어간다

 

+[교재 341 not null 제약조건]

 

 


제약조건 추가하기, 삭제하기

 

create table user100(

id nchar(10),

name varchar(20),

age number(3)

);

 

-- 테이블 생성을 한 후에 id 에다가 pk를 추가하고 싶을때

alter table user100

add primary key (id);

 

alter table default_user100

add constraint user100_pk primary key (id);

--원래 기본형태에는 constraint [명칭] 이 들어가지만 생략도 가능

 

select * from all_constraints

where table_name='DEFAULT_USER100'; -- 제약조건 확인하기/ 테이블네임의 값을 써줄때에는 무조건 대문자로 써줘야함 !!!

--제약조건의 이름이 SYS_C007120로 생성

 

alter table default_user100

add constraint user100_pk primary key (id);

--제약조건 이름설정해주면 설정한 이름으로 들어간다

 

alter table default_user100

drop constraint SYS_C007120;

--제약조건 삭제하기 제약조건 이름으로 넣어줘야한다

 

insert into default_user100(id) values('ppk'); --정상

insert into default_user100(id) values('ppk'); --정상

 

alter table default_user100

add primary key (id); -- 하면 중복되는 값이 들어가있어서 오류가난다

 

delete from default_user100; --레코드 삭제하기

 

alter table default_user100

add primary key (id); --다시 하면 실행 된다

 

 


[교재 346 테이블 수정]

 

create table user100(

id nchar(10),

name varchar(20),

age number(3)

);

 

--컬럼 추가하기

alter table user100

add email varchar(50) not null;

 

--확인하기

desc user100;

 

--컬럼 삭제하기

alter table user100

drop column email;

 

--확인하기

desc user100;

 

 

 

alter table user100

drop column email;

 

select * from user100;

insert into user100(id, loc, age) values ('ppk','서울',100);

 

alter table user100

drop column age; --제거 됨

 

--컬럼 추가하기

alter table user100

add age number(3);

 

--컬럼 디폴트값 지정해주기

alter table user100

add age number(3) default 17;

 

 

--1 테이블 제거

drop table user100;

--2 테이블 생성

create table user100(

id nchar(10),

loc varchar(20)

);

--3 레코드 추가

insert into user100(id, loc) values ('ppk','서울');

--4 보기

select * from user100;

--5 컬럼추가하면서 디폴드값 설정

alter table user100

add age number(3) default 17;

--6 컬럼 제거

alter table user100

drop column age;

--7 컬럼 추가 디폴트 없이

alter table user100

add age number(3);

 

 

 

-- 컬럼 형 바꾸기 ( 대부분 사이즈를 키우는 것 )

alter table user100

modify (id nchar(20)); --정상

 

alter table user100

modify (id nchar(8)); -- 사이즈 오류 나머지는 공백으로 10이 잡혀있기 때문에

 

 

alter table user100

modify (loc varchar(30)); --정상

 

alter table user100

modify (loc varchar(10)); -- 정상

 

alter table user100

modify (loc varchar(7)); --정상

 

alter table user100

modify (loc varchar(5)); --사이즈 오류남

 

 

 

--테이블 만들기

create table user200(

id nchar(10),

loc varchar(20),

age varchar(3)

);

 

--컬럼형 바꾸기

alter table user200

modify (age number(3)); --정상

 

--컬럼형 다시 바꾸기

alter table user200

modify (age varchar(3)); --정상 ( 현재 안에 데이터가 없음)

 

 

select * from user200;

 

insert into user200(id, loc, age) values ('ppk','서울','25');

 

 

alter table user200

modify (age number(3)); --오류남 (문자를 숫자를 바꿀 수는 없다)

 


 

--테이블 만들기

create table t100(

id varchar(10),

pwd varchar(20)

);

 

 

 

[교재 356 뷰의 장점]

 

--자동증가 값을 만들어준다 (시퀀스는 오라클에만 있다)

create SEQUENCE s_table

INCREMENT BY 1

start with 1001;

 

--컬럼 확인하기

DESC t100;

 

insert into t100( id, pwd) values (s_table.nextval, '1234');

insert into t100( id, pwd) values (s_table.nextval, '1234');

insert into t100( id, pwd) values (s_table.nextval, '1234');

insert into t100( id, pwd) values (s_table.nextval, '1234');

 

select * from t100;

 

-- 1001,1002,1003,1004 로 보임

 

insert into t100( id, pwd) values (s_table.nextval, '1234가나다라마바사');

insert into t100( id, pwd) values (s_table.nextval, '1234가나다라마바사');

insert into t100( id, pwd) values (s_table.nextval, '1234가나다라마바사');

insert into t100( id, pwd) values (s_table.nextval, '1234가나다라마바사');

-- 총오류 4번이 나고

 

insert into t100( id, pwd) values (s_table.nextval, '4567');

-- 이거 넣으면 1009번으로 들어간다 (1005번으로 들어가는게 아님)

 

--삭제하고 다시 추가추가 하면

delete from t100 where id='1009';

insert into t100( id, pwd) values (s_table.nextval, '4567');

insert into t100( id, pwd) values (s_table.nextval, '4567');

1010,1011 로들어감

 

오류나, 삭제도 다 카운팅 들어간다

 

--t300 테이블 만들어서

create table t300(

id varchar(10),

pwd varchar(20)

);

 

insert into t300( id, pwd) values (s_table.nextval, '4567');

insert into t100( id, pwd) values (s_table.nextval, '1234');

 

select * from t300;

select * from t100;

--t100, t300 번갈아가면서 추가하면 번갈아 가면서 카운팅 된다

 

--3씩 증가하는 시퀀스만들기

create SEQUENCE s_table2

INCREMENT BY 3

start with 1001;

 

--t400테이블 만들기

create table t400(

id varchar(10),

pwd varchar(20)

);

 

insert into t400( id, pwd) values (s_table2.nextval, '4567');

insert into t400( id, pwd) values (s_table2.nextval, '4567');

insert into t400( id, pwd) values (s_table2.nextval, '4567');

select * from t400;

--3씩 증가하는 걸 볼 수 있다

 

 

[교재 342 임시테이블]

 

select 5+7

from dual;

-- dual 이라는 임시테이블을 만듦 12 (5+7) 라는 값이 임시테이블에 저장됨

 

[ 교재 251 암시적인 형 변환(자동형변환) ]

 

select '5'+'7'

from dual;

--이값은 57로 나오는게 아니라 12로 나옴. 즉 자동 형 변환이 되는 것이다

 

select '5'||'7'

from dual;

-- 문자연결은 || 를 쓴다 (오라클에서만 가능하다)

 

select concat('5','7')

from dual;

--concat은 다른 DBMS에서도 사용할 수 있다

 

select concat('5','ABC')

from dual;

 

select concat('5','ABC','99')

from dual;

--오류가 난다 / CONCAT은 2개의 문자열만 연결 할 수 있다

 

select '5'||'7'||'연결'

from dual;

--여러 문자열 연결이 가능하다

 

--문자열 길이 나타내기

select length('한글') from dual; --2

select length('한글'),length('abcd') from dual; --2, 4

select lengthB('한글'),length('abcd') from dual; --B를 추가해서 써주면 바이너리값인 6 으로 나옴