如何用一个查询更新多行(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)
对不起,这不是我要问的。谢谢。对不起,这不是我要问的。谢谢