본문 바로가기

DB

(18)
테이블 생성시 유의사항 아래 와 같이 특정 글자 수로 저의되는 형태는 DATA TYPE CHAR를 권장 스키마 CREAT 할때 같이 하면 됨 create table table_name ( F_FIELD_NAME char(12), CONSTRAINT ROLE_NAME_TEST CHECK (F_FIELD_NAME in ('a','b','c') ) );--table_name 이라는 테이블에 F_FIELD_NAME 필드에 값이 들어갈때 a,b,c 인지 체크 하는 룰----- 이하 생성 후 수정할 때ALTER TABLE table_name ADD CONSTRAINTCONSTRAINT ROLE_NAME_TEST CHECK ( F_FIELD_NAME IN ( 'FIELD1', 'FIELD2', 'FIELD3', 'FIELD4', ..
오라클 bulk insert 속도개선 오라클에 몇 천만 이상 건의 데이터를 insert 할 때는 속도가 안나오는 경우가 많았다.아래같은 쿼리를 사용하여 속도를 개선할 수 있었다.--기존 4분11초INSERT INTO T_MAIN_LOG SELECT * FROM T_TMP_LOG WHERE F_CD = 'CD1';COMMIT;--1. NOLOGGING 로그삭제ALTER TABLE T_MAIN_LOG NOLOGGING ;--2. /*+ append */ 추가--10초로 개선됨INSERT /*+ append */ INTO T_MAIN_LOG SELECT *FROM T_TMP_LOG WHERE F_CD = 'CD1';--3. 삭제했던 logging 다시추가ALTER TABLE T_MAIN_LOG LOGGING ;--주의점 rollback 못함 D..
db 테이블 명세서 작성 쿼리 SELECT A.TABLE_NAME AS TABLE_NAME, A.TAB_CMT AS 테이블설명, A.COLUMN_NAME AS 컬럼명, B.POS AS PK, A.COL_CMT AS 컬럼설명, A.DATA_TYPE AS 데이터유형, A.데이터길이, A.NULLABLE AS NULL여부, A.COLUMN_ID AS 컬럼순서, A.DATA_DEFAULT AS 기본값FROM(SELECT S1.TABLE_NAME, S3.COMMENTS AS TAB_CMT, S1.COLUMN_NAME, S2.COMMENTS AS COL_CMT, S1.DATA_TYP..
join 다중 업데이트 DB 사용중에 다중 업데이트를 사용해야하는 경우입니다.​고쳐야되는 상황) A테이블에 F_ID가 B테이블의 F_NAME과 같을 경우 B테이블의 F_ID로 전환시켜줘야한다.A 테이블의 있는 데이터를 B 테이블과 매치되는 경우에 한하여 업데이트를 해야해서 처음에는 MERGE 문을 사용했습니다.MERGE INTO T_SONG AUSING T_MEMBER BON (A.F_ID = B.F_NAME)WHEN MATCHEDTHENUPDATE SET A.F_ID = B.F_ID;이렇게 했더니 오류가 납니다.[99999][38104] ORA-38104: ON 절에서 참조되는 열은 갱신할 수 없음: "A"."F_ID"​이런식으로 MERGE문은 ON 절에서 참조되는 열은 업데이트에 사용할 수 없다고 합니다. ..
오라클 구분자를 사용한 문자열을 행으로 변환(regexp, connect by level) 해당 데이터 중 F_NATCD 열의 데이터를 | 로 구분하여 행으로 표현 할 것이다.​1. connected by level오라클에서의 for문이라고 보면된다. 조건을 넘지않는한 계속 반복하여 쿼리를 수행한다.select level from dual connect by level 2. REGEXP_REPLACE 정규식LENGTH(REGEXP_REPLACE(f_natcd,'[^|]+',''))+1 정규식과 LENGTH를 활용하여 구분자 개수만큼 반복실행할 수 있도록 해준다.ex) 데이터가 aaa | bbb | ccc 라면 REGEXP_REPLACE(f_natcd,'[^|]+','') 의 반환값은 | | 이 되고 LENGTH 값은 2가 나오게 된다.​ 3. REGEXP_SUBSTR 정규식2번의 REPLACE..
오라클,MySQL 특정 문자 정렬 리스트를 출력하다보면 특정문자로 정렬해서 나타내야되는 경우가있다.​예를들어 데이터 중 필드에 '완료'가 된 데이터를 먼저 출력해야될때가 있다면오라클의경우SELECT * FROM T_TABLE ORDER BY DECODE(F_STATUS,'완료',1);이런식으로 오라클 내장 함수인 DECODE를 사용하여 F_STATUS에 완료인 필드들을 1순위로 출력해주면 된다. ​Mysql(MariaDB)의경우SELECT * FROM T_TABLE ORDER BY FIELD(F_STATUS,'가','가나다') DESC;Mysql의 경우 FIELD함수를 사용하여 위와같이 1순위 '가', 2순위 '가나다' 라는 단어가 필드에 들어가는 데이터 우선정렬을 출력해줄 수 있다.​오라클과 Mysql의 다른점은 오라클 DECODE의 ..
쿼리 조건절 유의점 어찌보면 당연하지만 가끔씩 깜빡하는게 하나있다. 간단한 예시를 하나 들자면난 t_main 테이블의 f1 필드에 test 라는 데이터를 제외한 모든 데이터를 불러오려고 한다. 아래와 같이 쿼리를 짰다.select * from t_main where f1 != 'test';얼핏보면 문제가 없어 보이지만 저렇게 하게되면 f1필드의 데이터가 test가 아님에도 불구하고 검색되지 않는 것들이 발견된다.바로 f1이 null 인 데이터들은 결과로 나오지않는다... 이걸 주의해서select * from t_main WHERE f1 IS NULL OR f1 != 'test';or null 처리를 하거나 nvl 처리를 해주자(가급적 or 처리가 좋다)
drop 테이블 복구 drop table 테이블명 으로 삭제한 테이블을 복구하는 방법이다주의점으로는1. purge 를 사용하여 삭제한 테이블의 경우에는 복구되지 않는다.2. 복구한 테이블의 index명은 달라진다.  1. 휴지통에 있는 데이터 조회SELECT * FROM RECYCLEBIN- 삭제된 정보가 나오며 ORIGINAL_NAME과 OPERATION을 활용하여 복구가 가능하다. 2. 테이블 복구하기FLASHBACK TABLE 테이블명 TO BEFORE DROP 이름으로 복구할 때, 동일테이블명에 대해 여러오브젝트가 휴지통에 있는경우가장 최근 삭제된 순서로 Flashback(복구) 된다. 3. 특정 테이블 휴지통에서 제거-- 휴지통에서 삭제하려는 테이블의 ID (OBJECT_NAME)에 쌍따옴표로 감싸야 한다.PURGE..

반응형