Php 每当我添加一个新条目时,我的mySQL存储的add-update-delete过程就会替换表中的最后一个条目
有Oracle和Microsoft SQL方面的经验,但对mySQL非常陌生,以前从未遇到过此问题。有什么想法吗?代码如下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
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版本显然不是。。。我将删除该评论