동일한 ID를 가진 경우 A 테이블의 NAME 컬럼 값을 B 테이블의 NAME 값으로 변경해야 하는 상황이 생겼다. 아래와 같은 경우로, A테이블에 NAME 컬럼이 추가 되어 기본값 NULL 값으로 되어있는데, B테이블에서 해당 ID의 NAME을 찾아 업데이트를 해줄 것이다.이럴 때 UPDATE JOIN을 통해서 쉽게 변경이 가능하다.UPDATE TB_A A JOIN TB_B B ON A.ID = B.ID SET A.NAME = B.NAME WHERE 조건문 근데 이렇게 그냥 바로 되었다면 난 이 블로그를 쓰지 않았을 것이다.업데이트를 하는데 이상하게 Duplicate 키 에러가 발생하였다. 테이블 A의 PK는 ID와 REGIST_DATE인데 나는 이 컬럼들을 업데이트 하지 않았다.근데 왜 중..
나는 데이터베이스에 대해 아직 잘 모른다. 할 수 있는건...정말 단순 CRUD정도.. DB에 대해서 잘 몰라서 생겼던 문제점에 대해서 작성해보려고 한다. 채팅 내용을 저장하는 테이블을 설계 할 때 방 이름과 등록일을 primary key로 잡았었다.(해당 테이블은 이해를 돕기 위해 임의로 생성한 테이블이며, 실제로 사용 된 테이블이 아닙니다)CREATE TABLE `MESSAGE` ( `ROOM_ID` varchar(20) NOT NULL, `USER_ID` varchar(20) NOT NULL, `MESSAGE` varchar(100) NOT NULL, `REGIST_DATE` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), PRIMARY KEY (..
Communications link failure 에러는 디비 연결이 끊어진 경우에 쿼리를 실행 한 경우 나는 에러이다. 아래와 같이 SELECT 1이라는 vaildation query를 실행하는데 이미 db connection이 꾾어졌기 때문에 validation query를 실행하는데 에러가 발생한 것이다. DB서버에서 연결을 끊어버리는 기준이 되는 시간과 관련 된 설정값은 wait_timeout이다. 아래의 명령어를 입력하면 wait_timeout이 몇초로 설정되어있는지 확인 가능하다.(기본값 : 28800초) 나는 개발서버에서 Communications link failure 가 자주 나타나서 (사실 validation query를 실행시키고 나서 컨넥션을 맺고 다음 쿼리를 실행시키기 때문에 무시..
누군가 서버를 리부팅 해도 되냐고 물어봐서 하라고 한 후 서비스를 올리는데 데이터베이스를 찾을 수 없다는 에러가 났다. 내 데이터베이스 명은 대문자인데 (예:TEST_DB) 에러는 소문자로 test_db를 찾을 수 없다는 것이다. 응...? 그래서 lower_case_table_names 설정을 확인했더니 value 값이 1로 되어있었다. linux는 value의 기본값이 0이다. show variables like 'lower_case_table_names' 여기서 내가 착각 한 것이 있는데, 0은 sensitive이고 1은 insensitive 이니 이 문제는 아니라고 생각했다. 왜냐하면 1은 대소문자를 구분하지 않으니 명령어 use TEST_DB; 를 입력하든 use test_db; 입력하든 데이터..
두 사람이 주고 받은 대화를 tb_tx와 tb_rx로 나누어서 저장한다. 두 테이블은 동일한 구조고, tx 한번, rx한번 순서대로 이야기를 한다. tb_tx와 tb_rx는 아래의 컬럼을 가지고 있다 id 한 대화의 아이디 talk_text 발화 내용 talk_seq 발화 순서 regist_date 등록일 만약 regist_date가 rx와 tx가 동일하다면 단순히 union all로 데이터를 합쳐서 order by regist_date로 하면 될 것이다. (union은 중복을 제거하기 때문에, 두 데이터의 중복이 확실히 없다면 union all을 쓰는게 성능면에서 좋다) 그런데 여기서 문제는 등록일이 동일하다는 것이다. why...왜 그렇게 되어있는지는 모른다.. 이럴 때 해결 방법을 알아보자. 우선,..
아래와 같이 반복되는 값이 많으면, 우리는 변수를 사용하고 싶다. 현재 날짜가 세번이나 반복된다. SELECT CASE WHEN ((SELECT COUNT(*) FROM TB_INFO I WHERE I.REGIST_DATE > DATE_FORMAT(NOW(), '%Y%m%d')) = 0) THEN CONCAT(DATE_FORMAT(NOW(), '%Y%m%d'), '-', '0001') ELSE CONCAT(DATE_FORMAT(NOW(), '%Y%m%d'), '-', LPAD(NEXT_ID + 1, '4', '0')) END AS no FROM TB_KEY_GENERATE WHERE NAME = 'injeong'; mysql 변수 사용법은 간단하다. 아래처럼 사용하면 된다. @변수명:=값 SELECT A..
한 컬럼 값의 최댓값을 가져와서 +1을 해줘야 할 때 바로 생각해 낼 수 있는 방법은 아래와 같이 서브쿼리를 사용하는 방법이다. UPDATE tb_key_generate SET NEXT_ID = (SELECT NEXT_ID FROM tb_bot_key WHERE name = 'injeong') + 1 WHERE name = 'injeong'; 그러나 항상 서브쿼리는 성능이 안좋다는 이야기를 많이 들어서 변경 방법을 찾아보니 join으로 변경 할 수 있었다. (사실 이정도 쿼리는 성능상의 차이가 없다. 하지만 조인으로 변경 할 수 있는지를 아는것과 모르는것은 하늘과 땅차이라고 생각한다. ) UPDATE tb_key_generate t1 INNER JOIN tb_key_generate t2 ON t1.nam..
다중디비 설정은 간단한데 아주 중요한..부분이 있다. 이 부분을 놓치면...몇시간동안 뻘짓 할 수도 있으니...꼭 확인하기! 0️⃣ DB dependency - 오라클은 maven에서 정식으로 지원하지 않기 때문에 아래처럼 repository를 설정해줘야 드라이버를 다운받을 수 있다 - DB버전 : 오라클 11g , mariaDB 10.6 oracle ORACLE JDBC Repository http://www.datanucleus.org/downloads/maven2/ com.oracle.ojdbc ojdbc8 19.3.0.0 org.mariadb.jdbc mariadb-java-client 2.6.0 1️⃣ datasource 설정 classpath:/egovframework/egovProps/glo..
- Total
- Today
- Yesterday
- Docker
- 오토에버코테
- 현대오토에버
- 전자정부프레임워크
- centos
- 아파치카프카
- Spring
- springboot
- Kubernetes
- 스프링
- 현대코테
- 리액트
- react
- java
- tomcat
- 도커
- 톰캣
- 자바코테
- 코테
- Linux
- 자바
- mysql
- softeer
- 자바스크립트
- softeer java
- javascript
- java 코테
- 쿠버네티스
- 코딩테스트
- 현대
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |