1

このコードを別の脅威に投稿しましたが、この質問は少し異なります。引き金を引かなければなりません。質問は次のように聞こえます。

「いつ、誰が製品を生産したかに関する情報が削除されるたびに、使用されていない場合はシーズンを削除するトリガーを作成します (つまり、「生産」テーブルからレコードが削除されるたびに、同じシーズンに生産されている製品に関する他のレコードがあるかどうかを確認します)そうでない場合は、季節テーブルから対応するレコードも削除します)」

私のMYSQLコード:

MYSQL コードは次のとおりです。

CREATE TABLE IF NOT EXISTS Dvds(
Serial integer NOT NULL,
Name varchar(50),
Year integer,
Genre varchar(50),
Price integer,
PRIMARY KEY (Serial));

CREATE TABLE IF NOT EXISTS Shops(
Id integer NOT NULL,
Name varchar(50),
Address varchar(50),
PRIMARY KEY (Id));

CREATE TABLE IF NOT EXISTS Customers(
CNo integer NOT NULL,
AccNo integer,
Time varchar(50),
PRIMARY KEY (CNo));

CREATE TABLE IF NOT EXISTS ContactPersons(
Id integer NOT NULL,
Name varchar(50),
Phone integer,
PRIMARY KEY (Id));

CREATE TABLE IF NOT EXISTS Seasons(
StartDate date NOT NULL,
EndDate date NOT NULL,
PRIMARY KEY (StartDate,EndDate));

CREATE TABLE IF NOT EXISTS WebShops(
Id integer NOT NULL,
Url varchar(50),
FOREIGN KEY (Id) REFERENCES Shops (Id),
PRIMARY KEY (Id));

CREATE TABLE IF NOT EXISTS Producer(
Id integer NOT NULL,
Address varchar(50),
Name varchar(50),
PRIMARY KEY (Id));

CREATE TABLE IF NOT EXISTS Sold(
Id integer NOT NULL,
CNo integer NOT NULL,
Serial integer NOT NULL,
FOREIGN KEY (Id) REFERENCES Shops (Id),
FOREIGN KEY (CNo) REFERENCES Customers (CNo),
FOREIGN KEY (Serial) REFERENCES Dvds (Serial),
PRIMARY KEY (Id,CNo,Serial));

CREATE TABLE IF NOT EXISTS Has(
Id integer NOT NULL,
Serial integer NOT NULL,
FOREIGN KEY (Id) REFERENCES Shops (Id),
FOREIGN KEY (Serial) REFERENCES Dvds (Serial),
PRIMARY KEY (Id,Serial));

CREATE TABLE IF NOT EXISTS Has2(
Serial integer NOT NULL,
Producer_Id integer NOT NULL,
StartDate date NOT NULL,
EndDate date NOT NULL,
ContactPersons_Id integer NOT NULL,
FOREIGN KEY (Serial) REFERENCES Dvds (Serial),
FOREIGN KEY ( Producer_Id) REFERENCES Producer (Id),
FOREIGN KEY (StartDate) REFERENCES Seasons (StartDate),
FOREIGN KEY (EndDate) REFERENCES Seasons (EndDate),
FOREIGN KEY (ContactPersons_Id) REFERENCES ContactPersons (Id),
PRIMARY KEY (Serial,Producer_Id,StartDate,EndDate,ContactPersons_Id));

引き金:

CREATE TRIGGER `Seasons_before_delete` 
    AFTER DELETE ON `Seasons`
    FOR EACH ROW 
    BEGIN
    DELETE FROM seasonstart
    WHERE seasonstart.???????
    DELETE FROM seasonend
    WHERE seasonend.??????
    END

しかし、私は本当に知りません。IF先生は、 、ELSEIFGOTOEND?を使えると教えてくれました。しかし、私は正しい軌道に乗っていますか? 私は今何をすべきか本当に空白なので、誰かがこれを解決するために私にできることを提案してくれることを願っていますか?

4

1 に答える 1

2

トリガーには、2 つの仮想テーブルがあります。

NEWOLD

明らかに、createトリガーには no がoldあり、deleteトリガーにはありませんnew。したがって、変更が発生したテーブル (トリガーがアタッチされているテーブル) のデータを使用する場合は、これら 2 つのテーブルを使用します。

これはdeleteトリガーであるため、テーブルを使用する必要がありoldます。

したがって、トリガーは次のようになります。

CREATE TRIGGER `Seasons_before_delete` AFTER DELETE ON `Seasons`
FOR EACH ROW 
BEGIN
  DELETE FROM seasonstart
  WHERE seasonstart.seasonID = old.ID

  DELETE FROM seasonend
  WHERE seasonend.seasonID = old.ID
END

AFTER DELETEトリガーを「something_something_BEFORE」と呼ぶのはほとんど意味がないことに注意してください:-)。

IFさらに、このトリガーに inが必要な理由がわからないことに注意しwhereてください。delete ステートメントで既に処理されています。

于 2012-12-06T17:37:19.217 に答える