2012-12-06 3 views
1

이 코드를 다른 위협에 게시했지만이 질문은 약간 다릅니다. 나는 방아쇠를 당겨야 해. 문제는이 같은 소리 :MYSQL에서 방아쇠가 발생하여

"Create a trigger that removes the season if unused whenever information about when and who produces a product is deleted (i.e., whenever a record is removed from the 'Produces' table, check if there are other records about product being produced for the same season, if not, remove also the corresponding record from the season table)"

내 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, ELSEIF, GOTOEND을 사용할 수 있다고 말했습니다. 그러나 나는 바른 길 위에있다? 나는 지금 무엇을 해야할지 정말 비어 있습니다. 그래서 누군가가 제안을하기를 바랍니다. 제가 이것을 해결하기 위해 무엇을 할 수 있습니까?

+0

코드를 포맷하려면 강조 표시 한 다음 Ctrl-k를 누르거나 편집기에서 {{} 버튼을 클릭하십시오. 작은 인라인 코드 비트의 경우 "코딩 된"텍스트 주위에 역 따옴표 (')를 사용하십시오. –

+0

@Johan - 숙제 표를 사용하지 마십시오. 그것은 쓸모가 없습니다. – Mike

+0

알아,하지만 여기서 100 % 정확한거야. – Johan

답변

2

트리거에는 2 개의 가상 테이블이 있습니다.

NEWOLD.

create 트리거에는 분명히 old이없고 delete 트리거에는 new이 없습니다. 변경 사항이 발생한 테이블의 데이터 (트리거가 연결된 테이블)를 사용하려면이 두 테이블을 사용하십시오.

delete 트리거이므로 old 테이블을 사용해야합니다. 이 :-) "something_something_BEFORE"는 AFTER DELETE 트리거를 호출하는 거의 의미가 있음을

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 

참고 :

그래서 트리거는 다음과 같이 보일 것입니다.

이 트리거에서 IF이 왜 필요한지 알 수 없으므로 delete 문에 where이 이미 처리됩니다.

+0

답변 해 주셔서 감사합니다. 나는 그것으로 놀아 보려고 노력했다. I've는이 입력 한 : 이 트리거를 CREATE'Seasons_before_delete' 후 seasonend 로부터 seasonstart.seasonID = old.ID DELETE WHERE seasonstart 에서 삭제 을 BEGIN 각 행에 대해 Seasons' 'ON DELETE WHERE seasonend.seasonID = 오래된 .ID END 그리고 난이 오류 : http://postimage.org/image/5sr35zrfv/ 미안하지만 난 MySQL은 꽤 새로운 오전. 나는 {} 버튼을 찾을 수 없습니까? 코드가 엉망이지만 다시 나를 도울 수 있기를 바랍니다. :/ – McDuck4

+0

흠 마지막으로 .. 방아쇠가 작동하는지 어떻게 테스트해야합니까? - /? 지금까지 도와 주셔서 감사합니다. – McDuck4

+0

myphpadmin의 My Seasons 데이터베이스는 다음과 같습니다. http : // postimage.조직/이미지/5n4yczg57/ – McDuck4

관련 문제