我有表:團隊和匹配。Oracle PL/SQL約束觸發器
'團隊'存儲足球隊的信息,我特別感興趣的是國家/地區領域。
'Matches'存儲關於'Team'中列出的球隊之間發生的足球比賽的信息。我從這張表中感興趣的領域是比賽場地。根據比賽類型:「全英格蘭」或「全西班牙」等,所涉及的團隊應來自適當的國家。
我目前正在嘗試編寫一個約束觸發器來處理這個問題,但是在運行時即使編譯好的時候,SQL Developer也會拋出一個非常神祕的錯誤「無效且失敗的重新驗證」。任何人都在意幫忙嗎?建議以更好的方式做事情也會很棒。下面的PL/SQL塊,我很抱歉,如果下面的代碼讓你們任何一個哭了。我知道我很可怕
CREATE OR REPLACE TRIGGER matchcountry_BIR
BEFORE INSERT ON matches
FOR EACH ROW
DECLARE
invalidEng EXCEPTION;
invalidSpa EXCEPTION;
team1 teams.Country%type;
team2 teams.Country%type;
comp matches.Competition%type;
BEGIN
SELECT Country INTO team1 FROM teams WHERE TeamID = :new.TeamID_A;
SELECT Country INTO team2 FROM teams WHERE TeamID = :new.TeamID_B;
comp:=:new.Competition;
IF (comp='All England') AND (team1!='England' AND team2!='England') THEN
RAISE invalidEng;
END IF;
IF (comp='All Spain') AND (team1!='Spain' AND team2!='Spain') THEN
RAISE invalidSpa;
END IF;
EXCEPTION
WHEN invalidEng THEN
RAISE_APPLICATION_ERROR(-20005, 'Countries are invalid for a English competition.');
END;
EXCEPTION
WHEN invalidSpa THEN
RAISE_APPLICATION_ERROR(-20006, 'Countries are invalid for a Spanish competition.');
END;
如果問題出在表格上,我還包括了他們的Create語句。再次,對這些建議或批評是非常受歡迎的。
CREATE TABLE teams
(
TeamID number(2) PRIMARY KEY,
TeamName varchar2(50),
Country varchar2(30),
CHECK (Country='Spain' OR Country='England')
);
CREATE TABLE matches
(
MatchID number(2) PRIMARY KEY,
TeamID_A number(2),
TeamID_B number(2),
Goal_A number(2),
Goal_B number(2),
Competition varchar2(50),
CONSTRAINT fk_TeamA FOREIGN KEY(TeamID_A) REFERENCES teams,
CONSTRAINT fk_TeamB FOREIGN KEY(TeamID_B) REFERENCES teams,
CHECK (Goal_A >= 0),
CHECK (Goal_B >= 0),
CHECK (Competition='Champions League' OR Competition='Europa League' OR Competition='All England' OR Competition='All Spain')
);
在Oracle中,你使用'和'運營商,而不是''&&,所以你應該在你的代碼進行更改。另外,爲什麼你從'matches'表中選擇了'MatchID'等於新記錄ID的比賽?您應該使用':new.competition'來檢查新記錄的值。 –
複合鍵外鍵可以讓你用聲明方式解決你的問題。 –
嗯謝謝你的評論。我已經提出了你建議的修正,Przemyslaw。 但是,我仍然收到相同的錯誤。 – ScoopsaHaagenDazs