如何用一个查询更新多行(perl-mysql)?

如何用一个查询更新多行(perl-mysql)?,mysql,perl,rows,Mysql,Perl,Rows,我需要用一个查询更新多行。对于插入我们通常做一些类似的事情 INSERT INTO `table` (c1,c2,c3) VALUES (1,2,3), (4,5,6), .. 然而,如果每一行的值不同于另一行,我们如何对更新执行类似的操作呢?还有一个条件与每行的id有关 有人面临过类似的问题吗 我现在必须如何进行更新的示例如下: UPDATE questions SET lab='What sections do you believe the site must not have?

我需要用一个查询更新多行。对于插入我们通常做一些类似的事情

INSERT INTO `table` (c1,c2,c3) VALUES 
 (1,2,3),
 (4,5,6),
 ..
然而,如果每一行的值不同于另一行,我们如何对更新执行类似的操作呢?还有一个条件与每行的id有关

有人面临过类似的问题吗

我现在必须如何进行更新的示例如下:

UPDATE questions
SET lab='What sections do you believe the site must not have?',
    type='textarea',
    options=''
WHERE rnum=11;

UPDATE questions
SET lab='What is your favourate section?',
    type='radio',
    options='section1,section2,section3,section4,section5'
WHERE rnum=12;

等等。显然,这是最糟糕的方法,因为每个查询都需要执行,并且可能有多达20个查询。

考虑下面的示例,它会增加列“col\u name”的所有值,该列的id>5,col\u name不是0

id    col_name
1       1
5       2
6       3
7       5
8       6
9       7
10      0
质疑

O/p将是

id    col_name
1       1
5       2
6       4
7       6
8       7
9       8
10      0

考虑下面的示例,它会增加id>5且col_name不是0的列“col_name”的所有值

id    col_name
1       1
5       2
6       3
7       5
8       6
9       7
10      0
质疑

O/p将是

id    col_name
1       1
5       2
6       4
7       6
8       7
9       8
10      0

如果要使用另一个表中的值更新一个表,则很容易:

update table1,table2
SET table1.value = table2.value
WHERE table1.key = table2_foreign_key
update table1
SET table1.value = (table1.value * 2)
WHERE table1.id in (SELECT id from table1 where table1.key > 50);

如果要通过以一致的方式更改行子集来更新一个表,则很容易:

update table1,table2
SET table1.value = table2.value
WHERE table1.key = table2_foreign_key
update table1
SET table1.value = (table1.value * 2)
WHERE table1.id in (SELECT id from table1 where table1.key > 50);

如果您试图更新一个表中的多个记录,其中每个记录的更新方式不同,而不使用第二个表,那么这基本上是不可能的。最好在代码中这样做。

如果要用另一个表中的值更新一个表,那么很容易:

update table1,table2
SET table1.value = table2.value
WHERE table1.key = table2_foreign_key
update table1
SET table1.value = (table1.value * 2)
WHERE table1.id in (SELECT id from table1 where table1.key > 50);

如果要通过以一致的方式更改行子集来更新一个表,则很容易:

update table1,table2
SET table1.value = table2.value
WHERE table1.key = table2_foreign_key
update table1
SET table1.value = (table1.value * 2)
WHERE table1.id in (SELECT id from table1 where table1.key > 50);

如果您试图更新一个表中的多个记录,其中每个记录的更新方式不同,而不使用第二个表,那么这基本上是不可能的。最好在代码中执行此操作。

使用占位符,可以通过多次执行同一查询来执行此操作:

my @data = (
  [ 'new_lab1', 'new_type1', 'new_opt1', 1 ],
  [ 'new_lab2', 'new_type2', 'new_opt2', 2 ],
);

my $sql = <<EOT;
UPDATE questions
SET lab=?,
    type=?,
    options=?
WHERE rnum=?
EOT

my $sth = $dbh->prepare($sql);
for my $datum (@data) {
    $sth->execute(@$datum);
}
my@data=(
['new_lab1'、'new_type1'、'new_opt1',1],
[‘新标签2’、‘新类型2’、‘新选项2’、2],
);
my$sql=execute(@$datum);
}

使用占位符,您可以多次执行同一查询:

my @data = (
  [ 'new_lab1', 'new_type1', 'new_opt1', 1 ],
  [ 'new_lab2', 'new_type2', 'new_opt2', 2 ],
);

my $sql = <<EOT;
UPDATE questions
SET lab=?,
    type=?,
    options=?
WHERE rnum=?
EOT

my $sth = $dbh->prepare($sql);
for my $datum (@data) {
    $sth->execute(@$datum);
}
my@data=(
['new_lab1'、'new_type1'、'new_opt1',1],
[‘新标签2’、‘新类型2’、‘新选项2’、2],
);
my$sql=execute(@$datum);
}

首先,为什么需要在一个查询中执行此操作?如果您需要以原子方式完成更新,是否可以将它们包装在
启动事务中
提交?我可能会这么做

但是,如果您确实需要在一个查询中完成此操作,并且您正在更新的行数相当少,则可以完成此操作!你或许可以使用这个丑陋的小把戏:

UPDATE questions
SET
lab = IF(rnum=11, 'What sections...?',
        IF(rnum=12, 'What is your...?',
          IF(rnum=13, 'Etc.',
            NULL
          )
        )
      ),
type = IF(rnum=11, 'textarea',
         IF(rnum=12, 'radio',
           IF(rnum=13, 'Etc.',
             NULL
           )
         )
       )
WHERE rnum IN (11, 12, 13);
在perl中编写循环来构造这种自然怪胎,这只是一个练习:)


如果您写得正确,并且表如您所相信的那样,那么就永远不应该使用那些剩余的空值。为了增加安全性,如果可以,您可能希望将其中一些列声明为
非空
,这样,如果
rnum
不匹配,分配将导致约束失败,
更新将中止。

首先,为什么需要在一个查询中执行此操作?如果您需要以原子方式完成更新,是否可以将它们包装在
启动事务中
提交?我可能会这么做

但是,如果您确实需要在一个查询中完成此操作,并且您正在更新的行数相当少,则可以完成此操作!你或许可以使用这个丑陋的小把戏:

UPDATE questions
SET
lab = IF(rnum=11, 'What sections...?',
        IF(rnum=12, 'What is your...?',
          IF(rnum=13, 'Etc.',
            NULL
          )
        )
      ),
type = IF(rnum=11, 'textarea',
         IF(rnum=12, 'radio',
           IF(rnum=13, 'Etc.',
             NULL
           )
         )
       )
WHERE rnum IN (11, 12, 13);
在perl中编写循环来构造这种自然怪胎,这只是一个练习:)


如果您写得正确,并且表如您所相信的那样,那么就永远不应该使用那些剩余的空值。为了增加安全性,如果可以的话,您可能希望将其中一些列声明为
非NULL
,这样,如果
rnum
不匹配,分配将导致约束失败,
更新将中止。

随着时间的推移,我找到了一种更好的方法,通过一次查询,而不是使用For循环。 其思想是在重复更新时使用insert,并将记录键放在insert上,这将强制查询执行更新

INSERT INTO table_name 
                            (key, a, b) 
                            VALUES 
                            (1,'apple','orange'),
                            (2,'xyz','abc')
                            ON DUPLICATE KEY
                            UPDATE 
                            a= VALUES(a),
                            b= VALUES(b)

随着时间的推移,我找到了一种更好的方法来实现这一点,通过一个查询,而不是使用for循环。 其思想是在重复更新时使用insert,并将记录键放在insert上,这将强制查询执行更新

INSERT INTO table_name 
                            (key, a, b) 
                            VALUES 
                            (1,'apple','orange'),
                            (2,'xyz','abc')
                            ON DUPLICATE KEY
                            UPDATE 
                            a= VALUES(a),
                            b= VALUES(b)

对不起,这不是我要问的。谢谢。对不起,这不是我要问的。谢谢