0

単独で実行すると機能する更新クエリがありますが、ストアド プロシージャ内で呼び出されると文句を言います。

mysql> UPDATE `user` SET `password`=COALESCE(NULL, `password`) WHERE `id`=1;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0


mysql> CALL updateUser(1, NULL, NULL, '1950-02-05', NULL);
ERROR 1048 (23000): Column 'male' cannot be null

ここにストアドプロシージャがあります

DELIMITER $$
CREATE PROCEDURE `updateUser` (IN userId varchar(255), IN password varchar(100), IN male tinyint(1), IN birthday datetime, IN fbId varchar(160))
BEGIN
    START TRANSACTION;
        UPDATE `user` SET `male` = IFNULL(male, `male`), `password` = IFNULL(password, `password`), `birthday` = IFNULL(birthday, `birthday`) WHERE `id` = userId;

        IF fbId IS NOT NULL THEN
            ...
        END IF;
    COMMIT;
END

IFNULL の代わりに COALESCE を使用して更新クエリを定義しようとしましたが、結果は同じでした。何が起こっているのか、どうすれば私の手順を機能させることができるのか、誰か知っていますか?

4

1 に答える 1

0

問題は、ストアド プロシージャの引数が列の名前と同じであることです。代わりにこれを試してください:

DELIMITER $$
CREATE PROCEDURE `updateUser` (IN p_userId varchar(255),
                               IN p_password varchar(100),
                               IN p_male tinyint(1),
                               IN p_birthday datetime,
                               IN p_fbId varchar(160))
BEGIN
    START TRANSACTION;
        UPDATE `user` SET `male` = IFNULL(p_male, `male`),
                          `password` = IFNULL(p_password, `password`),
                          `birthday` = IFNULL(p_birthday, `birthday`)
        WHERE `id` = p_userId;

        IF fbId IS NOT NULL THEN
            ...
        END IF;
    COMMIT;
END

male次の式のため、NULL 値を受け入れないというエラーが発生しています。

coalesce(male, `male`)

テーブル内の列ではなく、ストアド プロシージャの引数を両方とも参照しています。

于 2013-07-07T20:59:53.417 に答える