MySQL 程序无法识别表格
MySQL procedure doesn't recognise tables
它无法识别我在程序上方创建的 tables,它在字段列表中显示:unknown table "tourstats"
。
table tourstats 故意不包含数据,因为我在过程调用中插入数据,当我执行过程调用时,它说: unknown table "tourstats"
在字段列表中, [=25= 也是如此] "participates"
.
我的目标是编写一个输入为 tour_id
的过程。如果这个 tour_id
在 tourID
列的 table tourstats
中,我要么删除它,要么更新它,如果不在,我插入它。这 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');
我刚刚注意到您的第一个 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
语句,但是当我尝试在存储过程中使用它时,我得到了与您得到的相同的错误。如果我更改为我建议的语法,我不会收到错误。
附录
现在您遇到了不同的错误,我看到您正在 运行 将过程与您希望插入到 table 中的值连接起来,让我们只测试该部分:
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 中了。祝你好运。
它无法识别我在程序上方创建的 tables,它在字段列表中显示:unknown table "tourstats"
。
table tourstats 故意不包含数据,因为我在过程调用中插入数据,当我执行过程调用时,它说: unknown table "tourstats"
在字段列表中, [=25= 也是如此] "participates"
.
我的目标是编写一个输入为 tour_id
的过程。如果这个 tour_id
在 tourID
列的 table tourstats
中,我要么删除它,要么更新它,如果不在,我插入它。这 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');
我刚刚注意到您的第一个 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
语句,但是当我尝试在存储过程中使用它时,我得到了与您得到的相同的错误。如果我更改为我建议的语法,我不会收到错误。
附录
现在您遇到了不同的错误,我看到您正在 运行 将过程与您希望插入到 table 中的值连接起来,让我们只测试该部分:
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 中了。祝你好运。