라벨이 SQL인 게시물 표시

XX000: template database "template1" has a collation version mismatch

XX000: template database "template1" has a collation version mismatch Npgsql + EF Core 사용 중 발생한 문제 collation version mismatch 며칠 전부터 Docker 관련 문제로 인해 백업하고 복구하는 과정에서 발생한 문제이다. 아마도 postgres 이미지의 버전업 때문에 발생한 문제로 보인다. 이 문제는 Update-Database (dotnet ef database update) 실행 중 발생했다. 추측하기로 프로젝트에 저장된 마이그레이션 정보에 있는 collcation version과 실제로 마이그레이트 되고 있는 DB의 collation version이 달라서 발생하는 문제 같다. The template database was created using collation version 2.31, but the operating system provides version 2.36. 그렇다면 collation version을 최신화 해주면 된다. Refresh Collation Version PostgreSQL에서 특정 DB의 collation version을 최신화하려면 다음과 같은 쿼리를 날리면 된다. 여기선 문제가 발생한 템플릿 DB인 template1 DB를 대상으로 하겠다. ALTER DATABASE template1 REFRESH COLLATION VERSION ; 잘 적용되었는지 확인해보자. SELECT datcollversion FROM pg_database WHERE datname = 'template1' ; datcollversion 2.36 이제 다시 DB를 업데이트해보면 정상적으로 작동하는 것을 확인할 수 있다.

[MyBatis/MySQL] 하나의 Mapper Method에서 여러개의 Statement를 쿼리하는 방법

마이바티스 MySQL에서 한 번에 여러개의 구문 실행하기?   제목에도 쓰여있듯, MySQL 사용자를 위한 방법입니다. 일반적으로 아래와 같이 Mapper XML에 작성하고 돌리면 구문 에러가 날 겁니다. UPDATE md SET call_count = NULL #{callCount} WHERE biz_id = ( SELECT id FROM business WHERE cat3 = #{id} ); UPDATE category_3rd SET call_count = NULL #{callCount} WHERE id = #{id};   웃기는 건, 워크벤치나 IDE 자체 내장 SQL 툴로 돌리면 된다 라는 겁니다. 하지만 그건 해당 툴들이 Multiple Queries를 지원하기 때문 이죠.   감이 잡히셨죠? Multiple Queries를 지원 가능하게 하면 됩니다. 한 번에 여러 구문 실행 가능하게 하는 방법   다시 말씀드리지만, MySQL  전용입니다. 다른 DB들은 각각 따로 방법이 있는 듯 했습니다. Oracle의 경우엔 BEGIN .. END를 썼던가 하고, MSSQL의 경우엔 GO를 중간에 집어넣었던 것 같고... 암튼 그것들은 그냥 흘려봤기 때문에 직접 검색하시고, 여기선 MySQL 기준으로 알려드리겠습니다.   DB Connection URL 에 allowMultiQueries=true 를 추가해주세요. 전 현재 스프링 프레임워크를 사용중이므로 Bean Configuration을 예시로 들겠습니다. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="url" value=...

[SQL] WHERE절에 다른 테이블의 컬럼을 연동시키기

SQL WHERE절에 다른 테이블의 컬럼을 연동?   제목만 봐서는 감이 잘 안 잡히실겁니다. 제가 봐도 이 제목은 똥이지만, 밤을 새서 작업하는 중이라 어쩔 수가 없네요... 이해를 돕기 위해 제가 처한 상황을 예시로 들어보겠습니다.   현재 저는 세 개의 테이블이 있습니다. `md` : `business` 테이블의 id 를 biz_id  외래 키로 갖는 테이블 `business` : `category` 테이블의 id 를 cat 외래 키로 갖는 테이블 `category` : 카테고리 테이블   실제론 더 다양한 컬럼들이 있지만, 필요한 건 위의 정보가 다 입니다. 제가 하려는건, `md`  테이블의 call_count 를 바꿔야 한다. 조건 컬럼은 `md` . biz_id 이다. biz_id 를 id 로 갖는  `business`  테이블의  cat 이 특정 값과 일치해야 한다.   과연 어떻게 해야 저걸 정상적으로 실행시킬 수 있을지 찾아보다가 비교적 쉽게 답을 얻었습니다. 아래와 같이 하시면 됩니다. UPDATE md SET call_count = #{callCount} WHERE biz_id = (SELECT id AS biz_id FROM business WHERE cat = #{cat}   해석하자면, `business` . cat 이 #{cat}에 해당하는 레코드의  `business` . id 를 biz_id 로 명명해 가져온 뒤, `md` . biz_id 를 가져온 id 와 비교해 일치하는 레코드의 `md` . call_count 를 #{callCount}로 변경하라는 의미입니다.   참 쉽죠? 제가 지금 글을 개떡같이 써서 알아보기 힘드실지도 모르지만, 한 번 직접 실행하며 곱씹어보시면 이해가 금방 되실겁니다.   참고:  http://stackoverflow.com/que...

MySQL LIKE연산시 \(Escape Backslash) 처리 방법

SELECT * FROM `table` WHERE `path` LIKE "%C:\\ABC\\DEF%";   위와 같은 쿼리를 날리면 빈 응답만이 돌아올 겁니다. LIKE 연산자를 사용할 경우엔 백슬래시를 네 번 써줘야 정상적으로 작동합니다. SELECT * FROM `table` WHERE `path` LIKE "%C:\\\\ABC\\\\DEF%";