MySQL程序无法识别表格

时间:2016-10-12 15:16:34

标签: mysql procedures

它无法识别我在程序上方创建的表格,并在字段列表中显示: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');

1 个答案:

答案 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中了。祝你好运。