Моя mySQL сохраненная процедура добавления обновления обновления заменяет последнюю запись в таблице всякий раз, когда я добавляю новую запись - PullRequest
1 голос
/ 13 марта 2020

Опыт работы с Oracle и Microsoft SQL, но супер новым для mySQL и никогда ранее не сталкивался с этой проблемой. Какие-нибудь мысли? Код ниже

CREATE PROCEDURE spAddUpdateDelete_Product (IN productId INT, IN title VARCHAR(200), IN description VARCHAR(200), IN price FLOAT, IN categoryId INT, IN toDelete BIT)
BEGIN 
    IF productId = 0 THEN                                                           -- Add
        IF EXISTS(SELECT productId FROM Product WHERE title = title AND description = description AND price=price and categoryId = categoryId) OR NOT EXISTS(SELECT categoryId FROM Category WHERE categoryid=categoryid) THEN
            SELECT -1;
        ELSE 
            INSERT INTO Product (productTitle, description, price, categoryId) VALUES (title, description, price, categoryId);
            SELECT LAST_INSERT_ID();
        END IF;
    END IF;
    IF toDelete = 1 THEN                                                            -- Delete
        IF EXISTS(SELECT reviewId FROM Review WHERE productId=productId) THEN
            UPDATE Product SET toDelete = 1 WHERE productId = productId;
            SELECT 0;
        ELSE 
            DELETE FROM Product WHERE productId = productId;
            SELECT 0; 
        END IF;
    END IF; 

    IF EXISTS(SELECT productId FROM Product WHERE productId=productId) THEN         -- Update
        UPDATE Product SET productTitle=title, description=description, price=price, categoryId=categoryId;
        SELECT productId;
    ELSE
        SELECT -1;
    END IF;
END $$

1 Ответ

0 голосов
/ 13 марта 2020

понял это. Я не осознавал, что использование SELECT не работает как использование возврата в функцию. Обновленный код ниже.

CREATE PROCEDURE spAddUpdateDelete_Product (IN productId INT, IN title VARCHAR(200), IN description VARCHAR(200), IN price FLOAT, IN categoryId INT, IN toDelete BIT)
BEGIN 
    IF toDelete = 0 THEN                                                            -- Add/Update
        IF NOT EXISTS(SELECT categoryId FROM Category c WHERE c.categoryid=categoryid) THEN
            SELECT -1;
        ELSE 
            IF productId = 0 THEN
                INSERT INTO Product (productTitle, description, price, categoryId) VALUES (title, description, price, categoryId);
                SELECT LAST_INSERT_ID() AS productId;
            ELSE
                UPDATE Product SET Product.productTitle = title, Product.description = description, Product.price = price, Product.categoryId = categoryId WHERE Product.productId = productId;
                SELECT productId;
            END IF; 
        END IF;
    END IF;
    IF toDelete = 1 THEN -- Delete
        IF EXISTS (SELECT productId FROM product WHERE Product.productId = productId) THEN
            IF EXISTS(SELECT reviewId FROM Review WHERE Review.productId=productId) THEN
                UPDATE Product SET toDelete = 1 WHERE Product.productId = productId;
                SELECT 0;
            ELSE 
                DELETE FROM Product WHERE Product.productId = productId;
                SELECT 0; 
            END IF;
        ELSE 
            SELECT -1;
        END IF;
    END IF; 

END $$
...