上記の手順で作成したテーブルは認識されず、フィールドリストに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');
これはMySQLまたはMS SQL Serverですか? – CGritton
MySQLサーバー –
'tourstats!= TourStats':http://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html –