MySQL 程序无法识别表格

MySQL procedure doesn't recognise tables

它无法识别我在程序上方创建的 tables,它在字段列表中显示:unknown table "tourstats"。 table tourstats 故意不包含数据,因为我在过程调用中插入数据,当我执行过程调用时,它说: unknown table "tourstats" 在字段列表中, [=25= 也是如此] "participates".

我的目标是编写一个输入为 tour_id 的过程。如果这个 tour_idtourID 列的 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 中了。祝你好运。