2016-10-12 5 views
1

上記の手順で作成したテーブルは認識されず、フィールドリストにunknown table "tourstats"と表示されます。 プロシージャの呼び出しでデータを挿入し、プロシージャの呼び出しを実行するときに、フィールドリストのunknown table "tourstats"とテーブル"participates"の場合も同じですので、テーブルtourstatsには意図的にデータが含まれていません。MySQLプロシージャはテーブルを認識しません

私の目標は、入力がtour_idであるという手続きを書くことです。このtour_idがテーブルtourstatsの列tourIDにある場合は、削除または更新するか、更新しない場合は挿入します。これらの3つの最後のアクションは、プロシージャを呼び出す3つのトリガを使用して実行されますが、それは簡単な部分です。私はちょうどあなたの最初のIF句は問題であるかもしれないことに気づいた

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

これはMySQLまたはMS SQL Serverですか? – CGritton

+0

MySQLサーバー –

+0

'tourstats!= TourStats':http://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html –

答えて

0

は、ここに私のコードです。

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にそのをドロップする準備が整いました。がんばろう。

+0

はい私は試みましたが、私はまだ同じ問題を抱えています.. mysqlは大文字と小文字を区別しません.. –

+0

まだ私のために働いていません..私のロジックが間違っているのかMySQLが私と遊んでいるのか本当にわかりません。 –

+0

ストアドプロシージャ内のすべての条件を変更しましたか? – CGritton

関連する問題