Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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_Stored Procedures - Fatal编程技术网

MySQL存储过程,仅在特定条件下更新

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

存储过程将接受firstName、lastName、currentPostalCode和newPostalCode作为参数。仅当有一个人具有给定的名字、姓氏和当前postalCode时,我才想更新postalCode列

这是怎么做到的?您是否使用子查询或MySQL IF或其他什么


谢谢。

执行此操作不需要任何花哨的条件逻辑,只需要一个带有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