MySQL存储过程,仅在特定条件下更新
存储过程将接受firstName、lastName、currentPostalCode和newPostalCode作为参数。仅当有一个人具有给定的名字、姓氏和当前postalCode时,我才想更新postalCode列 这是怎么做到的?您是否使用子查询或MySQL IF或其他什么MySQL存储过程,仅在特定条件下更新,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,存储过程将接受firstName、lastName、currentPostalCode和newPostalCode作为参数。仅当有一个人具有给定的名字、姓氏和当前postalCode时,我才想更新postalCode列 这是怎么做到的?您是否使用子查询或MySQL IF或其他什么 谢谢。执行此操作不需要任何花哨的条件逻辑,只需要一个带有WHERE子句的常规UPDATE语句即可。如果WHERE子句未匹配任何行,则不会进行更新 /* Update the records with matching
谢谢。执行此操作不需要任何花哨的条件逻辑,只需要一个带有WHERE子句的常规UPDATE语句即可。如果WHERE子句未匹配任何行,则不会进行更新
/* Update the records with matching name & postcode */
UPDATE yourtable
SET postalCode = 'newPostalCode'
WHERE
/* If all 3 conditions don't match, nothing gets updated */
firstName = 'firstName'
AND lastName = 'lastName'
AND postalCode = 'oldPostalCode'
作为存储过程:
CREATE PROCEDURE updatePostalCode (
IN in_firstName VARCHAR(64),
IN in_lastName VARCHAR(64),
IN in_oldPostalCode VARCHAR(16),
IN in_newPostalCode VARCHAR(16)
)
BEGIN
UPDATE yourtable
SET
postalCode = in_newPostalCode
WHERE
lastName = in_lastName
AND firstName = in_firstName
AND postalCode = in_oldPostalCode;
END
附录:如果你真的只想在只有一场比赛的情况下这样做。。。
要仅在恰好有一个匹配行而不是2个或多个匹配行时更新,仍然可以使用普通update语句,并在WHERE子句中添加一个子查询
附录2:如果不存在一个匹配项,则带错误退出:
你的意思是说你只会在只有一个匹配行的情况下进行更新,因此2个匹配行不会被更新?是的,如果没有1个匹配行,也会抛出一个错误并退出查询。为此,你需要一些分支逻辑。请参阅下面的添加,它将匹配行的数量分配给一个变量,如果正好有一个匹配,则执行更新。谢谢,但当我运行查询时,它会显示语法错误,意外的leve_SYM。有什么想法吗?IF代码可能有问题吗?
UPDATE yourtable
SET postalCode = 'newPostalCode'
WHERE
/* If all 3 conditions don't match, nothing gets updated */
firstName = 'firstName'
AND lastName = 'lastName'
AND postalCode = 'oldPostalCode'
/* Result of count subquery = 1 */
AND (
SELECT COUNT(*) AS matched
FROM yourtable
WHERE firstName = 'firstName' AND lastName = 'lastName' AND postalCode = 'oldPostalCode'
) = 1
CREATE PROCEDURE updatePostalCode (
IN in_firstName VARCHAR(64),
IN in_lastName VARCHAR(64),
IN in_oldPostalCode VARCHAR(16),
IN in_newPostalCode VARCHAR(16)
)
BEGIN
DECLARE num_matched INT;
SET num_matched = (SELECT COUNT(*) FROM yourtable WHERE firstName = 'firstName' AND lastName = 'lastName' AND postalCode = 'oldPostalCode');
IF (num_matched <> 1) THEN
/* Trigger an error and exit */
LEAVE updatePostalCode
END IF
/* Perform the UPDATE statement */
END