2

ストアド プロシージャは、firstName、lastName、currentPostalCode、および newPostalCode を引数として取ります。指定された firstName、lastName、および currentPostalCode を持つ人が 1 人いる場合にのみ、postalCode 列を更新したいと考えています。

これはどのように行われますか?サブクエリや MySQL IF() などを使用していますか?

ありがとう。

4

1 に答える 1

3

このアクションを実行するのに特別な条件付きロジックは必要ありません。句を含む通常のUPDATEステートメントだけで実行できます。WHERE句に一致する行がない場合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

補遺: 一致するものが 1 つだけある場合にのみこれを実行したい場合は...

ちょうど 1 つの一致する行 (2 つ以上ではない) の場合にのみ更新するには、WHERE句に追加のサブクエリを使用して、プレーンな update ステートメントを引き続き使用できます。

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

補遺 2 一致するものが 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
于 2012-11-22T20:30:23.127 に答える