[project] 미니프로젝트 03/02 테이블 만들고 데이터 넣기

kafa·2023년 3월 2일
0

프로젝트

목록 보기
1/6

테이블 만들기 및 테이블에 데이터 넣기

날씨테이블에 변동사항이 생겼다.

PRIMARY KEY를 code로 지정했다가 regdate로 지정했다가 다시 code로 바꿨다.

첫 code는 날씨를 흐림0 맑음1 비2 눈3 이런 식으로 저장하려 했다. 그러나 데이터를 넣다 보니 고유하지 않아서 버렸다.

그래서 고유한게 뭘까 생각하다 떠오른 것이 regdate. 바로 날짜이다. 매일 다음날이 되니까 고유키로 적합하지 않을까.

ㄴㄴ. 지역별로 다른 날씨를 넣을거라 같은 날짜를 가진 행이 지역수만큼 필요해서 안된다.

마지막에 쓴 code는 그냥 '번호매기기'로 고유키로 적합하다.


LOCATION1 테이블 만들기 및 데이터 넣기

SET SERVEROUTPUT ON;

테이블 만들기

--- LOCATION1 테이블
CREATE TABLE location1
(
  no   NUMBER(5)    NOT NULL,
  name VARCHAR2(20),
  CONSTRAINT PK_location1 PRIMARY KEY (no)
);
--- 테이블 삭제하기
DROP TABLE weather1 CASCADE CONSTRAINTS;

데이터 추가하기

에 앞서 시퀀스와 함수 만들기

  • 시퀀스 만들기
-- 시퀀스 만듦
CREATE SEQUENCE SEQ_LOCATION1_NO INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCACHE;
-- 삭제
DROP SEQUENCE SEQ_LOCATION1_NO
  • 함수 만들기
-- 함수 만듦
CREATE OR REPLACE FUNCTION func_seq_location1_no_naxtval RETURN NUMBER
IS
BEGIN
    RETURN SEQ_LOCATION1_NO.NEXTVAL;
EXCEPTION WHEN OTHERS THEN
    RETURN null;
END;
/
-- 삭제
DROP FUNCTION func_seq_location1_no_naxtval;

이러고 데이터 추가를 하려 하니 칼럼사이즈가 작다는 오류가 떴다.

  • 칼럼사이즈 변경
ALTER TABLE location1 MODIFY(name varchar2(100));
  • 데이터 추가
-- 드디어 일괄 추가 ㄱㄱ
INSERT ALL
INTO location1 (no, name)
    VALUES(FUNC_SEQ_LOCATION1_NO_NAXTVAL, '서울특별시')
INTO location1 (no, name)
    VALUES(FUNC_SEQ_LOCATION1_NO_NAXTVAL, '부산광역시')
INTO location1 (no, name)
    VALUES(FUNC_SEQ_LOCATION1_NO_NAXTVAL, '대구광역시')
INTO location1 (no, name)
    VALUES(FUNC_SEQ_LOCATION1_NO_NAXTVAL, '인천광역시')
INTO location1 (no, name)
    VALUES(FUNC_SEQ_LOCATION1_NO_NAXTVAL, '광주광역시')
INTO location1 (no, name)
    VALUES(FUNC_SEQ_LOCATION1_NO_NAXTVAL, '대전광역시')
INTO location1 (no, name)
    VALUES(FUNC_SEQ_LOCATION1_NO_NAXTVAL, '울산광역시')
INTO location1 (no, name)
    VALUES(FUNC_SEQ_LOCATION1_NO_NAXTVAL, '세종특별자치시')
INTO location1 (no, name)
    VALUES(FUNC_SEQ_LOCATION1_NO_NAXTVAL, '경기도')
INTO location1 (no, name)
    VALUES(FUNC_SEQ_LOCATION1_NO_NAXTVAL, '강원도')
INTO location1 (no, name)
    VALUES(FUNC_SEQ_LOCATION1_NO_NAXTVAL, '충청북도')
INTO location1 (no, name)
    VALUES(FUNC_SEQ_LOCATION1_NO_NAXTVAL, '충청남도')
INTO location1 (no, name)
    VALUES(FUNC_SEQ_LOCATION1_NO_NAXTVAL, '전라북도')
INTO location1 (no, name)
    VALUES(FUNC_SEQ_LOCATION1_NO_NAXTVAL, '전라남도')
INTO location1 (no, name)
    VALUES(FUNC_SEQ_LOCATION1_NO_NAXTVAL, '경상북도')
INTO location1 (no, name)
    VALUES(FUNC_SEQ_LOCATION1_NO_NAXTVAL, '경상남도')
INTO location1 (no, name)
    VALUES(FUNC_SEQ_LOCATION1_NO_NAXTVAL, '제주특별자치도')
    SELECT * FROM DUAL;
 
-- 데이터 삭제  
DELETE FROM location1
WHERE no = 4;


ROLLBACK;

COMMIT;

SELECT * FROM location1;

롤백을 유용하게 썼다..

ROLLBACK;

WEATHER1 테이블 만들기 및 데이터 넣기

테이블 만들기

-- WEATHER1 테이블(수차례의 수정끝에)
DROP TABLE weather1 CASCADE CONSTRAINTS;
CREATE TABLE weather1
(
  code     number(10)   NOT NULL,
  regdate  TIMESTAMP    NOT NULL,
  weather  VARCHAR2(50),
  TEMPHIGH NUMBER(2)   ,
  TEMPROW  NUMBER(2)   ,
  no       NUMBER(5)    NOT NULL,
  CONSTRAINT PK_weather1 PRIMARY KEY (code)
);
  • 제약조건
    제약조건은 두가지를 걸어줬다.
    지역에서 오는 외래키와 최저기온이 최고기온보다 높으면 안된다는 것.
-- 외래키
ALTER TABLE weather1
	ADD CONSTRAINT FK_location1_TO_weather1
    	FOREIGN KEY (no)
    REFERENCES location1 (no);
    
-- 최저기온은 최고기온보다 큰 값을 가질 수 없다
ALTER TABLE weather1 
	ADD CONSTRAINT TEMPHIGH_HOTTER_THEN_TEMPROW 
		CHECK(TEMPROW<=TEMPHIGH); 
        
ALTER TABLE weather1 DROP CONSTRAINT FK_location1_TO_weather1;
ALTER TABLE weather1 DROP CONSTRAINT TEMPHIGH_HOTTER_THEN_TEMPROW;

만약 제약조건으로 A,B,C,D 안에서만 넣을 수 있게 만들고 싶다면

ALTER TABLE 테이블명
	ADD CONSTRAINT 제약조건명
CHECK(GRADE IN('A','B','C','D');

데이터 추가하기

에 앞서 code 시퀀스를 만들자.
또 insert all into를 이용해 테이블에 데이터를 일괄로 넣기 위해 함수도 만들자.
시퀀스가 있을 때는 한꺼번에 넣을 때 시퀀스 다음숫자를 가져와주는 함수가 필요하다.

  • 시퀀스 만들기
-- 시퀀스
CREATE SEQUENCE SEQ_WEATHER1_CODE INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCACHE;
-- 삭제
DROP SEQUENCE SEQ_WEATHER1_CODE;
  • 함수 만들기
-- 함수
CREATE OR REPLACE FUNCTION func_SEQ_WEATHER1_CODE_naxtval RETURN NUMBER
IS
BEGIN
    RETURN SEQ_WEATHER1_CODE.NEXTVAL;
EXCEPTION WHEN OTHERS THEN
    RETURN null;
END;
/
-- 삭제
DROP FUNCTION func_SEQ_WEATHER1_CODE_naxtval;
  • 데이터 추가
-- 일괄입력
-- 데이터 어디서 가져오지 :https://www.weather.go.kr/w/weather/forecast/mid-term.do

INSERT ALL 
INTO WEATHER1 (code, regdate, weather, TEMPROW, TEMPHIGH, NO)
VALUES(func_SEQ_WEATHER1_CODE_naxtval, CURRENT_DATE+1 , '맑음', 8, 25, 30)
INTO WEATHER1 (code, regdate, weather, TEMPROW, TEMPHIGH, NO)
VALUES(func_SEQ_WEATHER1_CODE_naxtval, CURRENT_DATE+1 , '구름조금', 2, 14, 31)
INTO WEATHER1 (code, regdate, weather, TEMPROW, TEMPHIGH, NO)
VALUES(func_SEQ_WEATHER1_CODE_naxtval, CURRENT_DATE+1 , '구름많음', 3, 14, 32)
INTO WEATHER1 (code, regdate, weather, TEMPROW, TEMPHIGH, NO)
VALUES(func_SEQ_WEATHER1_CODE_naxtval, CURRENT_DATE+1 , '흐림', 3, 14, 33)
INTO WEATHER1 (code, regdate, weather, TEMPROW, TEMPHIGH, NO)
VALUES(func_SEQ_WEATHER1_CODE_naxtval, CURRENT_DATE+1 , '비', 3, 14, 34)
INTO WEATHER1 (code, regdate, weather, TEMPROW, TEMPHIGH, NO)
VALUES(func_SEQ_WEATHER1_CODE_naxtval, CURRENT_DATE+1 , '눈', 3, 14, 35)
INTO WEATHER1 (code, regdate, weather, TEMPROW, TEMPHIGH, NO)
VALUES(func_SEQ_WEATHER1_CODE_naxtval, CURRENT_DATE+1 , '비 또는 눈', 3, 14, 36)
INTO WEATHER1 (code, regdate, weather, TEMPROW, TEMPHIGH, NO)
VALUES(func_SEQ_WEATHER1_CODE_naxtval, CURRENT_DATE+1 , '천둥번개', 3, 14, 37)
INTO WEATHER1 (code, regdate, weather, TEMPROW, TEMPHIGH, NO)
VALUES(func_SEQ_WEATHER1_CODE_naxtval, CURRENT_DATE+1 , '안개', 3, 14, 38)
INTO WEATHER1 (code, regdate, weather, TEMPROW, TEMPHIGH, NO)
VALUES(func_SEQ_WEATHER1_CODE_naxtval, CURRENT_DATE+1 , '황사', 3, 14, 39)
SELECT * FROM DUAL;

DELETE FROM WEATHER1
WHERE TEMPROW = 3;

-- ORA-00001: 무결성 제약 조건(DS236.PK_WEATHER1)에 위배됩니다
-- DK .. tL. .

-- WEATHER1에 code 칼럼을 pk로 추가
-- 다시 삭제 생성 제약제약
--- 시퀀스 생성 SEQ_WEATHER1_CODE
-- 함수 생성 func_SEQ_WEATHER1_CODE_naxtval 
-- 일괄 수정 code, func_SEQ_WEATHER1_CODE_naxtval 추가

--TA--DA--
--10개 행 이(가) 삽입되었습니다.
--커밋 완료.


SELECT * FROM WEATHER1;

ROLLBACK;

COMMIT;

참조

  • 기상 종류

기상아이콘

WEATHER1에 weather 칼럼은 위의 그림을 참조했다. 이번에 임의로 데이터를 넣은 것 중에 중복 weather는 없는데 앞으로도 저 중에서만 예보로 사용하고 싶다.

  • 내일 날짜

CURRENT_DATE 키워드를 사용해 내일 날짜를 구하는 방법

SELECT CURRENT_DATE + 1; -- 내일 날짜
  • 컬럼 사이즈 바꾸기

컬럼 사이즈 변경 (ALTER TABLE COLUMN SIZE)

ALTER TABLE [테이블명] MODIFY ([컬럼명] VARCHAR2(2000)); 
  • 스키마

기상청 정보를 가져오려고 하는데 schema.org라는 확장자?를 보았다
스키마(Schema)란?
Schema.org로 웹 콘텐츠 구조화하기

어떻게 쓰는건지 아직 잘 모르겠다.

  • 함수 안쓰고! 시퀀스 있는 테이블 일괄추가!

근데 T1이 뭘까
걍 테이블 갯수인듯?
UNION ALL

-- 시퀀스가 있는 경우 (함수사용X)
INSERT INTO item(code, name, price, quantity, content, regdate) 
SELECT SEQ_ITEM_CODE.NEXTVAL code, T1.* FROM (
    SELECT '이름' name, 1234 price, 4500 quantity, '내용' content, CURRENT_DATE regdate FROM DUAL
    UNION ALL
    SELECT '이름' name, 1234 price, 4500 quantity, '내용' content, CURRENT_DATE regdate FROM DUAL
    UNION ALL
    SELECT '이름' name, 1234 price, 4500 quantity, '내용' content, CURRENT_DATE regdate FROM DUAL
) T1;
COMMIT;
profile
kafa is kafa. not be something other.

0개의 댓글