2016-07-04 57 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