ストアド プロシージャは、firstName、lastName、currentPostalCode、および newPostalCode を引数として取ります。指定された firstName、lastName、および currentPostalCode を持つ人が 1 人いる場合にのみ、postalCode 列を更新したいと考えています。
これはどのように行われますか?サブクエリや MySQL IF() などを使用していますか?
ありがとう。
ストアド プロシージャは、firstName、lastName、currentPostalCode、および newPostalCode を引数として取ります。指定された firstName、lastName、および currentPostalCode を持つ人が 1 人いる場合にのみ、postalCode 列を更新したいと考えています。
これはどのように行われますか?サブクエリや MySQL IF() などを使用していますか?
ありがとう。
このアクションを実行するのに特別な条件付きロジックは必要ありません。句を含む通常の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 つの一致する行 (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
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