它无法识别我在程序上方创建的表格,并在字段列表中显示:unknown table "tourstats"
。
表tourtats没有故意包含数据,因为我通过调用过程插入数据,当我执行过程调用时,它在字段列表中显示为unknown table "tourstats"
,对于表"participates"
也是如此。< / p>
我的目标是编写一个输入为tour_id
的过程。如果此tour_id
位于tourstats
列中的tourID
表中,我会删除它或更新它,如果不是,我会插入它。这3个最后的动作是使用调用过程的3个触发器完成的,但这很容易。
这是我的代码:
CREATE DATABASE IF NOT EXISTS TourDB;
USE TourDB;
CREATE TABLE if not exists PARTICIPATE (
CID SMALLINT NOT NULL,
TOURID VARCHAR(5) NOT NULL,
PAYMENT DECIMAL(9 , 2 ) NOT NULL,
PRIMARY KEY (CID , TOURID),
CHECK (PAYMENT > 0),
FOREIGN KEY (CID)
REFERENCES CUSTOMERS (CID)
ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (TourID)
REFERENCES TOURS (TourID)
ON DELETE RESTRICT ON UPDATE CASCADE
);
LOAD DATA LOCAL INFILE 'C:\\.........\\participate.csv'
INTO TABLE participate
COLUMNS TERMINATED BY ';'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
CREATE TABLE TourStats (
tourID VARCHAR(5) NOT NULL,
numCustomers INT NOT NULL,
revenue DECIMAL(9 , 2 ) NOT NULL,
PRIMARY KEY (tourID),
FOREIGN KEY (tourID)
REFERENCES Tours (tourID)
ON DELETE CASCADE ON UPDATE CASCADE
);
#PROCEDURE
delimiter //
create procedure UpdateTourStats (IN tour_id varchar(10))
begin
if (tour_id) in (tourstats.tourID) and (tour_id) = (participate.TOURID) then
#update
begin
update TourStats
set tourID = tour_id, numCustomers = count(participate.CID), revenue = sum(participate.PAYMENT);
end;
#insert
elseif (tour_id) not in (tourstats.tourID) and (tour_id) = (participate.TOURID) then
begin
insert into TourStats
values (tourid, count(participate.CID), sum(participate.PAYMENT));
end;
#delete
else
begin
delete from tourstats
where tourstats.tourID = tour_id;
end;
end if;
end//
delimiter ;
call UpdateTourStats ('tour2');
答案 0 :(得分:0)
我刚注意到你的第一个IF
子句可能有问题。
if (tour_id) in (tourstats.tourID) and (tour_id) = (participate.TOURID)
您询问某个值是否在列中,或者是否等于列。我想也许这应该改为
if tour_id in (select tourID from tourstats)
and tour_id in (select TOURID from participate)
现在你要问的是一个数据是否在一组数据中。
将列名直接放在IN
子句中似乎适用于SELECT
语句,但是当我尝试在存储过程中使用它时,我会得到相同的错误。如果我改为我建议的语法,我不会收到错误。
<强>附录强>
既然你得到了一个不同的错误,我发现你正在运行一个希望插入表中的值的过程,让我们测试一下这个部分:
if tour_id not in (select tourID from tourstats)
and tour_id in (select TOURID from participate) then
begin
insert into TourStats
select TOURID, count(CID), sum(PAYMENT)
from participate where TOURID = tour_id
group by TOURID;
end;
end if;
我认为你的其他陈述可能需要类似的调整。你应该能够从内到外工作,例如:你应该能够成功运行它:
select TOURID, count(CID), sum(PAYMENT)
from participate where TOURID = 'tour2'
group by TOURID;
如果可行的话,试试这个:
insert into TourStats
#Plus the above SELECT statement#
一旦你有了这个工作,你就可以把它放到你的SP中了。祝你好运。