sourcecode

Linux에서 입력 파일을 사용하여 여러 행을 업데이트하는 Mysql 쿼리

codebag 2023. 8. 26. 11:22
반응형

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

반응형