Php Insert语句在存储过程中不起作用
我最近在一个AWS EC2 Ubuntu实例上上传了我的MySQL数据库,现在我遇到了一个问题,我开发的存储过程在该实例上不能正常工作。它在Windows上的XAMPP实例上运行得非常好,所以我不完全确定问题出在哪里,因为我不熟悉Linux和AWS 以下是存储过程:Php Insert语句在存储过程中不起作用,php,mysql,amazon-web-services,stored-procedures,ubuntu-14.04,Php,Mysql,Amazon Web Services,Stored Procedures,Ubuntu 14.04,我最近在一个AWS EC2 Ubuntu实例上上传了我的MySQL数据库,现在我遇到了一个问题,我开发的存储过程在该实例上不能正常工作。它在Windows上的XAMPP实例上运行得非常好,所以我不完全确定问题出在哪里,因为我不熟悉Linux和AWS 以下是存储过程: DELIMITER $$ CREATE PROCEDURE sp_PopulateAbstract (conID INT, eID INT, abs TEXT) BEGIN DECLARE existID INT;
DELIMITER $$
CREATE PROCEDURE sp_PopulateAbstract
(conID INT, eID INT, abs TEXT)
BEGIN
DECLARE existID INT;
DECLARE abID INT;
SELECT a.contributorID INTO existID
FROM abstract a
WHERE a.contributorID = conID and a.eventID = eID;
IF conID = existID
THEN
--UPDATE statement works fine on Ubuntu instance
UPDATE abstract
SET abstract = abs
WHERE eventID = eID and contributorID = conID;
ELSE
--This statement doesn't work
INSERT INTO abstract
(eventID, contributorID, abstract)
VALUES (eID, conID, abs);
END IF;
SELECT a.abstractID INTO abID
FROM abstract a
WHERE a.eventID = eID and a.contributorID = conID;
SELECT abID as abstractID;
END$$
DELIMITER $$
BEGIN
DECLARE existID INT;
DECLARE abID INT;
SELECT a.contributorID INTO existID
FROM eventcontributor a
WHERE a.contributorID = conID and a.eventID = eID;
IF conID = existID
THEN
--cause of problem
SELECT a.contributorID INTO existID
FROM abstract a
WHERE a.contributorID = conID and a.eventID = eID;
IF conID = existID
THEN
UPDATE abstract
SET abstract = abs
WHERE eventID = eID and contributorID = conID;
ELSE
INSERT INTO abstract
(eventID, contributorID, abstract)
VALUES (eID, conID, abs);
END IF;
SELECT a.abstractID INTO abID
FROM abstract a
WHERE a.eventID = eID and a.contributorID = conID;
DELETE
FROM abstractattachments
WHERE abstractID = abID;
SELECT abID as abstractID;
ELSE
SELECT -1 as abstractID;
END IF;
END$$
这很奇怪,因为UPDATE
语句在Ubuntu实例上运行良好,而INSERT
语句则不行。INSERT
语句不插入任何内容,最后一个SELECT
语句返回NULL
。如果执行了UPDATE
语句,则最后一个SELECT
语句确实会返回一些内容,并且数据会相应地更新
我已经将
INSERT
语句作为独立语句运行,它工作正常,但在存储过程中不起作用。XAMPP实例和Ubuntu实例之间有什么区别?我已经找到了导致INSERT语句不起作用的原因,这与我在原始问题中遗漏的存储过程部分有关,我认为这不是问题的原因。以下是完整的程序:
DELIMITER $$
CREATE PROCEDURE sp_PopulateAbstract
(conID INT, eID INT, abs TEXT)
BEGIN
DECLARE existID INT;
DECLARE abID INT;
SELECT a.contributorID INTO existID
FROM abstract a
WHERE a.contributorID = conID and a.eventID = eID;
IF conID = existID
THEN
--UPDATE statement works fine on Ubuntu instance
UPDATE abstract
SET abstract = abs
WHERE eventID = eID and contributorID = conID;
ELSE
--This statement doesn't work
INSERT INTO abstract
(eventID, contributorID, abstract)
VALUES (eID, conID, abs);
END IF;
SELECT a.abstractID INTO abID
FROM abstract a
WHERE a.eventID = eID and a.contributorID = conID;
SELECT abID as abstractID;
END$$
DELIMITER $$
BEGIN
DECLARE existID INT;
DECLARE abID INT;
SELECT a.contributorID INTO existID
FROM eventcontributor a
WHERE a.contributorID = conID and a.eventID = eID;
IF conID = existID
THEN
--cause of problem
SELECT a.contributorID INTO existID
FROM abstract a
WHERE a.contributorID = conID and a.eventID = eID;
IF conID = existID
THEN
UPDATE abstract
SET abstract = abs
WHERE eventID = eID and contributorID = conID;
ELSE
INSERT INTO abstract
(eventID, contributorID, abstract)
VALUES (eID, conID, abs);
END IF;
SELECT a.abstractID INTO abID
FROM abstract a
WHERE a.eventID = eID and a.contributorID = conID;
DELETE
FROM abstractattachments
WHERE abstractID = abID;
SELECT abID as abstractID;
ELSE
SELECT -1 as abstractID;
END IF;
END$$
在这个完整的过程中,问题实际上是在变量existID
中重新选择一个值时引起的。出于某种原因,现在真正的问题是,如果MySQL的Ubuntu实例已经包含一个变量值,那么它不会覆盖该变量值。也许这与MySQL的版本不同于Ubuntu和我的Windows XAMPP上的版本有关
因此,变量existID
保留其初始值,嵌套的IF
语句测试为true
,这意味着实际执行的是UPDATE
语句,而不是INSERT
语句
解决此问题的方法是声明另一个变量,恰当地命名为existID2
,然后使用此变量,而不是重复使用existID
解决方案:
DELIMITER $$
BEGIN
DECLARE existID INT;
DECLARE existID2 INT;
DECLARE abID INT;
SELECT a.contributorID INTO existID
FROM eventcontributor a
WHERE a.contributorID = conID and a.eventID = eID;
IF conID = existID
THEN
--using a new, empty variable
SELECT a.contributorID INTO existID2
FROM abstract a
WHERE a.contributorID = conID and a.eventID = eID;
IF conID = existID2
THEN
UPDATE abstract
SET abstract = abs
WHERE eventID = eID and contributorID = conID;
ELSE
INSERT INTO abstract
(eventID, contributorID, abstract)
VALUES (eID, conID, abs);
END IF;
SELECT a.abstractID INTO abID
FROM abstract a
WHERE a.eventID = eID and a.contributorID = conID;
DELETE
FROM abstractattachments
WHERE abstractID = abID;
SELECT abID as abstractID;
ELSE
SELECT -1 as abstractID;
END IF;
END$$
为什么我的MySQL本地XAMPP实例可以重用变量,而我的AWS Ubuntu MySQL实例不能重用变量,这真的让我很困惑。这对我来说真的没有意义。一次执行一条语句。如果执行“if”语句,那么为什么执行“else”语句。在时间,如果或否则将执行