Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql,选择许多行,并以事务方式为每一行分配不同的值_Mysql_Sql - Fatal编程技术网

Mysql,选择许多行,并以事务方式为每一行分配不同的值

Mysql,选择许多行,并以事务方式为每一行分配不同的值,mysql,sql,Mysql,Sql,我有一个简单的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

我有一个简单的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');
我的应用程序有以下任务:一个请求带有一个代码数组,例如[1200,10,18],我需要从数据库中获取4行(等于数组大小),其中代码=0,并在每行用值1200,10,18临时更新代码id

要从另一个正在运行的线程更新代码的并发请求不应访问第一个线程的选定行

我该怎么做

更新后,第一个选定行的代码为1,第二个选定行的代码为200,第三个为10,最后一个为18。换句话说,任务必须找到带有未分配代码的行(code_id=0),并为每一行设置一个值


链接:

MySQL不支持数组。我建议您首先将数组加载到表中。这只是一种方便,但很方便

然后,您可以使用复杂的
更新
加入
来处理此问题:

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;

你可以在应用程序中构建一条语句来实现这一点

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

那么该表以后会是什么样子呢?不清楚您是想将
code\u id
更新为
1200,10,18
,还是想将选择的第一行更新为
code\u id
1
,第二行更新为
200
等请在问题中提供明确的样本数据(填写所有列),并为该数据添加所需的结果和提供的条件(输入数组)。我认为他希望用从请求数组中获得的数字更新code=0的行。就像第一行代码=0一样,第二行的值应该用1更新,第二行的值应该用200更新,以此类推。我假设太@kelvin,但假设是所有的母表^%$我没有第二个表的选项。@malefstro。您可以动态构建表。我对答案进行了编辑以说明如何操作。数字1、2、3、4是什么?@malefstro,这些数字是您要在其中放置值的位置。也就是说,200必须在2号位置。它们应该由应用程序创建。好的,我知道了,这些只是从1开始到数组大小结束的数字。它们不是列ID