Php 每当我添加一个新条目时,我的mySQL存储的add-update-delete过程就会替换表中的最后一个条目

Php 每当我添加一个新条目时,我的mySQL存储的add-update-delete过程就会替换表中的最后一个条目,php,mysql,lamp,Php,Mysql,Lamp,有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 productI

有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 $$

我想出来了。我没有意识到使用SELECT与在函数中使用return不一样。更新代码如下

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 $$

我想出来了。我没有意识到使用SELECT与在函数中使用return不一样。更新代码如下

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 $$

在运行了几次之后,它实际上用我想要添加的数据替换了每个条目。if语句在mySQL中的工作方式是否有些奇怪?您必须为使用的每个字段指定表别名,因为服务器无法区分哪里是表字段,哪里是变量,并且变量屏蔽了字段。也就是说,不是
WHERE productId=productId
(在变量为NULL之前始终为真),而是
WHERE Product.productId=productId
。在运行它几次之后,它实际上用我要添加的数据替换了每个条目。if语句在mySQL中的工作方式是否有些奇怪?您必须为使用的每个字段指定表别名,因为服务器无法区分哪里是表字段,哪里是变量,并且变量屏蔽了字段。也就是说,不是
WHERE productId=productId
(在变量为NULL之前始终为真),而是
WHERE Product.productId=productId
。此代码仍然不起作用。
productId=productId
将始终为真,因为MySQL将
productId
解释为表中的列。您需要更改输入变量的名称,使其与列名不同。感谢您指出这一点!我太习惯于使用@productId了,所以我忘了换这个。我想我只需要将Product.productId用于解决这个问题,这样为了方便起见,我仍然可以在过程中使用相同的名称。你确定吗?我确实做到了,通过调试和多次测试,它工作得很好。请在此处查看答案:。对我来说,productId不被解释为列。不确定您正在使用的SQL版本显然不是。。。我将删除注释此代码仍然无法工作。
productId=productId
将始终为真,因为MySQL将把这两个
productId
都解释为表中的列。您需要更改输入变量的名称,使其与列名不同。感谢您指出这一点!我太习惯于使用@productId了,所以我忘了换这个。我想我只需要将Product.productId用于解决这个问题,这样为了方便起见,我仍然可以在过程中使用相同的名称。你确定吗?我确实做到了,通过调试和多次测试,它工作得很好。请在此处查看答案:。对我来说,productId不被解释为列。不确定您正在使用的SQL版本显然不是。。。我将删除该评论