Mysql запрос на обновление нескольких строк с использованием входного файла из linux - PullRequest
1 голос
/ 07 февраля 2020

Я пытаюсь обновить несколько строк в БД, используя небольшой скрипт. Мне нужно обновить строки, основываясь на некоторых указанных c user_ids, которые есть в списке на Linux машине.

#! /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.

Как мне импортировать их в эту команду?

1 Ответ

0 голосов
/ 07 февраля 2020

Это действительно зависит от формата 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_ids в формате:

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: Добавьте , в начало каждой строки, кроме первой

Примечание. Если ваши идентификаторы имеют строгое число c, вам нужна только третья команда.

Это сделает ваш SQL query translate to:

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})";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...