Linux에서 입력 파일을 사용하여 여러 행을 업데이트하는 Mysql 쿼리
작은 스크립트를 사용하여 DB의 여러 행을 업데이트하려고 합니다.Linux 시스템의 목록에 있는 특정 user_ids를 기반으로 행을 업데이트해야 합니다.
#! /bin/bash
mysql -u user-ppassword db -e "update device set in_use=0 where user_id in ()";
위에서 보듯이 user_ids는 파일에 있습니다./opt/test/user_ids_txt
.
이 명령으로 어떻게 가져올 수 있습니까?
이는 user_ids_txt 형식에 따라 달라집니다.SQL에 대한 구문이 정확하다고 가정할 경우in
문, 다음이 작동합니다.
#! /bin/bash
mysql -u user-ppassword db -e "update device set in_use=0 where user_id in ($(< /opt/test/user_ids_txt))";
bash 인터프리터가 파일 내용을 대체합니다.이는 SQL 쿼리에 위험할 수 있으므로 구현하기 전에 터미널에서 명령을 반향하여 정확한지 확인합니다.명령줄에서 다음을 실행하기만 하면 SQL 조회를 미리 볼 수 있습니다.
echo "update device set in_use=0 where user_id in ($(< /opt/test/user_ids_txt))"
파일이 SQL에 없는 경우in
쿼리를 실행하기 전에 구문을 편집해야 합니다.저는 다음과 같은 것을 추천합니다.sed
이를 위하여
예
파일을 예로 들어 보겠습니다./opt/test/user_ids_txt
는 다음 형식의 user_id 목록일 뿐입니다.
aaa
bbb
ccc
사용할 수 있습니다.sed
올바른 SQL 구문으로 편집하기
sed 's/^/\'/g; s/$/\'/g; 2,$s/^/,/g' /opt/test/user_ids_txt
이 명령의 출력은 다음과 같습니다.
'aaa'
,'bbb'
,'ccc'
이걸 보시면.sed
명령을 실행하면 세미콜론으로 구분된 3개의 개별 명령이 표시됩니다.개별 명령의 의미는 다음과 같습니다.
1: 추가'
모든 행의 맨 앞까지
2: 추가'
모든 행의 끝까지
3: 추가,
첫 번째 줄을 제외한 모든 줄의 맨 앞까지
참고: ID가 숫자로만 표시되는 경우 세 번째 명령만 사용하면 됩니다.
이렇게 하면 SQL 쿼리가 다음으로 변환됩니다.
update device set in_use=0 where user_id in ('aaa'
,'bbb'
,'ccc')
이를 저장하기 위해 임시 파일을 만드는 대신 bash 변수를 사용하여 다음과 같이 쿼리에 연결합니다.
#! /bin/bash
in_statement="$(sed 's/^/\'/g; s/$/\'/g; 2,$s/^/,/g' /opt/test/user_ids_txt)"
mysql -u user-ppassword db -e "update device set in_use=0 where user_id in (${in_statement})";
언급URL : https://stackoverflow.com/questions/60115758/mysql-query-to-update-multiple-rows-using-a-input-file-from-linux
'sourcecode' 카테고리의 다른 글
도커를 통해 mariadb 연결이 실패하는 이유는 무엇입니까? (0) | 2023.08.26 |
---|---|
비활성화되지 않은 경우에만 호버 및 활성화 (0) | 2023.08.26 |
크롬 익스텐션(공식 튜토리얼에 따라 제작)이 작동하지 않음 (0) | 2023.08.26 |
메서드 setDrawerListener가 더 이상 사용되지 않습니다. (0) | 2023.08.26 |
java.util용 Spring JavaConfig.속성 필드 (0) | 2023.08.26 |