2016-07-04 37 views
0

我有這個ER圖:E-R Diagram 我已經做了SQL翻譯,我已經寫了所有的關係是這樣的:PostgreSQL的糾正觸發

CREATE DOMAIN origine 
AS VARCHAR(6) DEFAULT NULL 
CHECK (value ='upload' or value = 'link'); 

CREATE TABLE progetto.Utente (
ID_Utente VARCHAR(4) check (ID_Utente like ‘U%’), 
PRIMARY KEY (ID_Utente), 
Username VARCHAR(20) NOT NULL UNIQUE 
); 

CREATE INDEX progetto.IDX_Utente_ID_Utente 
ON progetto.Utente (ID_Utente); 

CREATE TABLE progetto.Bacheca (
ID_Bacheca VARCHAR(4) check (ID_Bacheca like ‘B%’), 
ID_Proprietario VARCHAR(4) NOT NULL, 
PRIMARY KEY (ID_Bacheca), 
FOREIGN KEY (ID_Proprietario) references progetto.Utente (ID_Utente) 
on update cascade 
on delete cascade, 
Titolo VARCHAR(20) NOT NULL, 
N_follower INT 
); 

CREATE TABLE progetto.Immagine (
ID_Img VARCHAR(4) check (ID_Img like ‘I%’), 
PRIMARY KEY (ID_Img), 
Origine origine, 
Descrizione VARCHAR(20) default NULL, 
Bacheca VARCHAR(4) NOT NULL, 
FOREIGN KEY (Bacheca) references progetto.Bacheca (ID_Bacheca) 
on update cascade 
on delete cascade, 
Possessore VARCHAR(4) NOT NULL, 
FOREIGN KEY (Possessore) references progetto.Utente (ID_Utente) 
on update cascade 
on delete cascade 
N_pin INT NOT NULL, 
N_like INT NOT NULL, 
N_preferiti INT NOT NULL, 
ID_Preferito VARCHAR (20) NOT NULL 
FOREIGN KEY (ID_Preferito) references progetto.Utente (ID_Utente) 
on update cascade 
on delete cascade 
); 

CREATE TABLE progetto.Topic (
ID_topic VARCHAR(4) check (ID_topic like ‘T%’), 
PRIMARY KEY (ID_topic), 
Nome VARCHAR(20) NOT NULL 
); 

CREATE TABLE progetto.Correlazione (
Immagine VARCHAR(4) NOT NULL, 
FOREIGN KEY (Immagine) references progetto.Immagine (ID_Img) 
on update cascade 
on delete cascade, 
Topic VARCHAR(20) NOT NULL, 
FOREIGN KEY (Topic) references progetto.Topic (ID_topic) 
on update cascade 
on delete cascade, 
PRIMARY KEY (Immagine, Topic) 
); 

CREATE TABLE progetto.Pin (
Utente VARCHAR(4) NOT NULL, 
FOREIGN KEY (Utente) references progetto.Utente (ID_Utente) 
on update cascade 
on delete cascade, 
Immagine VARCHAR(20) NOT NULL, 
FOREIGN KEY (Immagine) references progetto.Immagine (ID_Img) 
on update cascade 
on delete cascade, 
PRIMARY KEY (Utente, Immagine) 
); 

CREATE TABLE progetto.Likes (
Utente VARCHAR(4) NOT NULL, 
FOREIGN KEY (Utente) references progetto.Utente (ID_Utente) 
on update cascade 
on delete cascade, 
Immagine VARCHAR(20) NOT NULL, 
FOREIGN KEY (Immagine) references progetto.Immagine (ID_Img) 
on update cascade 
on delete cascade, 
PRIMARY KEY (Utente, Immagine) 
); 

CREATE TABLE progetto.FollowBacheca (
Utente VARCHAR(4) NOT NULL, 
FOREIGN KEY (Utente) references progetto.Utente (ID_Utente) 
on update cascade 
on delete cascade, 
Bacheca VARCHAR(4) NOT NULL, 
FOREIGN KEY (Bacheca) references progetto.Bacheca (ID_Bacheca) 
on update cascade 
on delete cascade, 
PRIMARY KEY (Utente, Bacheca) 
); 

CREATE TABLE progetto.FollowUtenti (
Follower VARCHAR(4), 
FOREIGN KEY (Follower) references progetto.Utente (ID_Utente) 
on update cascade 
on delete cascade, 
Followed VARCHAR(4), 
FOREIGN KEY (Followed) references progetto.Utente (ID_Utente) 
on update cascade 
on delete cascade, 
PRIMARY KEY (Follower, Followed) 
); 

CREATE TABLE progetto.Affinità (
Topic1 VARCHAR(4) NOT NULL, 
FOREIGN KEY (Topic1) references progetto.Topic (ID_topic) 
on update cascade 
on delete cascade, 
Topic2 VARCHAR(4) NOT NULL, 
FOREIGN KEY (Topic2) references progetto.Topic (ID_topic) 
on update cascade 
on delete cascade, 
PRIMARY KEY (Topic1, Topic2) 
); 

注:屬性在斜體是外鍵,加粗主鍵。

  • Utente(ID_Utente,用戶名)
  • Bacheca(ID_BachecaID_Proprietario,TITOLO,N_follower)
  • IMMAGINE(ID_img,ORIGINE,Descrizione,BachecaPossessore,N_pin,N_like,N_preferiti,ID_Preferito)Origine∈{UPLOAD,LINK} De scrizione可以是NULL
  • 主題(ID_topic,諾姆)
  • Correlazione(IMMAGINE,主題
  • 引腳(Utente,IMMAGINE
  • 喜歡(Utente, Immagine
  • FollowBacheca(Utente,Bacheca
  • FollowUtenti(跟隨,隨後
  • Attinenza(TOPIC1,標題2

現在我有一個問題。我想,當我刪除一個「Utente」(用戶)時,他在與「Possesso」的關係中使用的「Immagine」僅在「Immagine」的Origine爲「鏈接」時被刪除。

我想我必須使用觸發器,但我無法寫出一個觸發器。 有什麼建議嗎? PS:我很抱歉意大利的名字。

回答

0

是的,你應該用觸發器解決這個問題。首先,雖然,你應該從Immagine表中刪除ON DELETE CASCADE條款:

possessore varchar(4) NOT NULL REFERENCES progetto.Utente ON UPDATE CASCADE 

觸發功能是否刪除表Immagine,如果origine = 'link'並且在表Pin沒有行的圖像鏈接到用戶。請注意,這假設每個Utente只有一個Immagine。

CREATE FUNCTION progetto.delete_immagine_origine_link() RETURNS trigger AS $$ 
DECLARE 
    id_immagine varchar(4); 
    org   origine; 
BEGIN 
    -- Check if an Immagine is linked to the Utente 
    SELECT ID_Img, Origine INTO id_immagine, org 
    FROM progetto.Immagine 
    WHERE possessore = OLD.ID_Utente; 
    IF FOUND THEN 
     -- There is a row, but if the origine is wrong, fail the delete 
     IF org != 'link' THEN 
      RETURN NULL; 
     END IF; 

     -- Now check if there is a Pin row that links Immagine to Utente 
     PERFORM * FROM progetto.Pin 
     WHERE Utente = OLD.ID_Utente AND Immagine = id_immagine; 
     IF FOUND THEN 
      RETURN NULL; -- There is a link, fail the delete 
     END IF; 

     -- It is safe to delete the row from Immagine 
     DELETE FROM progetto.Immagine 
     WHERE ID_Img = id_immagine; 
    END IF; 

    -- Either there was no Immagine for the Utente or it has been deleted 
    -- so safe to delete Utente 
    RETURN OLD; 
END; 
$$ LANGUAGE plpgsql; 

觸發本身應該在Utente表中定義:

CREATE TRIGGER delete_from_utente 
    BEFORE DELETE ON progetto.Utente 
    FOR EACH ROW EXECUTE PROCEDURE progetto.delete_immagine_origine_link(); 
+0

嗯..好像它的工作。 如果我想添加「Immagine」不得與「Utente」的「Pin」關係的綁定呢? – user3004162

+0

什麼是「不成銷關係」的意思? 'N_pin'是一個數字;你的意思是'N_pin = 0',否則不刪除? – Patrick

+0

不在 針(Utente,Immagine) – user3004162