У меня есть простая таблица MySQL 8 вроде этой:
CREATE TABLE IF NOT EXISTS `test_codes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`segment_id` int(11) unsigned NOT NULL,
`code_id` int(11) DEFAULT 0,
PRIMARY KEY (`id`)
);
Таблица заполнена случайными значениями
INSERT INTO `test_codes` (`segment_id`) VALUES ('1');
INSERT INTO `test_codes` (`segment_id`) VALUES ('1');
INSERT INTO `test_codes` (`segment_id`) VALUES ('1');
INSERT INTO `test_codes` (`segment_id`) VALUES ('1');
INSERT INTO `test_codes` (`segment_id`) VALUES ('1');
INSERT INTO `test_codes` (`segment_id`) VALUES ('1');
INSERT INTO `test_codes` (`segment_id`) VALUES ('2');
INSERT INTO `test_codes` (`segment_id`) VALUES ('2');
INSERT INTO `test_codes` (`segment_id`) VALUES ('2');
INSERT INTO `test_codes` (`segment_id`) VALUES ('1');
INSERT INTO `test_codes` (`segment_id`) VALUES ('1');
У моих приложений следующая задача: запрос приходит с массивом кодов, например [1,200,10,18], и мне нужно получить 4 строки (равные размеру массива) из базы данных, где code = 0, и обновить code_id на каждой строка со значениями 1,200, 10, 18 переходно.
Параллельный запрос, который хочет обновить код из другого запущенного потока, не должен обращаться к выбранным строкам первого потока.
Как я могу это сделать?
После обновления первая выбранная строка будет иметь code_id 1, вторая выбранная строка code_id 200, третья 10 и последняя 18. Другими словами, задача должна найти строки с неназначенными кодами (code_id = 0) и установить значение для каждой строка.
Неясно, хотите ли вы обновить code_id до 1,200, 10, 18 или вы хотите обновить первую выбранную строку с code_id до 1, а вторую - с 200 и т. д.
Пожалуйста, укажите конкретные данные образца (заполните все столбцы) в вопросе и добавьте желаемый результат для этих данных и предоставленных критериев (входной массив).
обновил мой вопрос, каждая выбранная строка будет иметь новый code_id.
Я думаю, он хочет обновить строки с кодом = 0 числами, полученными из массива запросов. например, первая строка со значением code = 0 должна быть обновлена на 1, вторая - на 200 и т. д.
Я предполагаю, что тоже @kelvin, но предположение - мать всего ^% $ £ $%
На каком языке написано ваше приложение
Написано в cpp






MySQL не поддерживает массивы. Я бы посоветовал вам сначала загрузить массив в таблицу. Это просто удобство, но это удобно.
Затем вы можете использовать комплекс update с join, чтобы справиться с этим:
update test_codes tc join
(select tc2.*,
row_number() over (order by rand()) as seqnum
from test_codes tc2
) tc2
on tc2.id = tc.id join
(select nc.*,
row_number() over (order by code_id) as seqnum
from new_codes nc
) nc
on tc2.seqnum = nc.seqnum
set tc.code_id = nc.code_id;
Обновлено:
Вы можете построить запрос прямо из кодов:
update test_codes tc join
(select tc2.*,
row_number() over (order by rand()) as seqnum
from test_codes tc2
) tc2
on tc2.id = tc.id join
(select ? as code, 1 as seqnum union all
select ? as code, 2 union all
. . .
) nc
on tc2.seqnum = nc.seqnum
set tc.code_id = nc.code_id;
У меня нет возможности выбрать второй стол.
@malefstro. . . Вы можете построить стол на лету. Я отредактировал ответ, чтобы показать, как это сделать.
Вы можете сделать это с помощью одного оператора, который вы можете встроить в приложение.
update test_codes
join
(
select id, row_number() over (order by id) rn
from test_codes
where code_id = 0
) t on t.id = test_codes.id
join (
-- a table of new values with their positions
select 1 rn, 1 val union all
select 2, 200 union all
select 3, 10 union all
select 4, 18
) v on v.rn = t.rn
set code_id = v.val
Какие числа 1,2,3,4?
@malefstro, эти числа - позиции, на которые вы хотите поместить значения. Т.е. 200 должны занимать позицию 2. Они должны быть созданы приложением.
Хорошо, я понял, это просто числа, начинающиеся с 1 и заканчивающиеся размером массива. они не идентификаторы столбцов
Так как же таблица может выглядеть потом?