2013-03-24 116 views
0

我必須爲postgresql中的匹配部分問題提供解決方案。這是我做的..匹配postgresql中的部分實現

DROP TRIGGER IF EXISTS match_partial on futbolista; 

DROP FUNCTION IF EXISTS match_partial(); 

CREATE FUNCTION match_partial() 
RETURNS TRIGGER AS $$ 
DECLARE 
tmp club%ROWTYPE; 
BEGIN 
IF (NEW.id_club = NULL AND NEW.nom_club = NULL) THEN 
    RETURN NEW; 
ELSE 
    SELECT * INTO tmp FROM club WHERE (club.id_club = NEW.id_club AND club.nom_club = NEW.nom_club); 
    IF FOUND THEN 
     RETURN NEW; 
    ELSE 
     IF (NEW.id_club = NULL) THEN 
      SELECT * INTO tmp FROM club WHERE (club.nom_club = NEW.nom_club); 
      IF FOUND THEN 
       RETURN NEW; 
      END IF; 
     ELSE 
      IF (NEW.nom_club = NULL) THEN 
       SELECT * INTO tmp FROM club WHERE (club.id_club = NEW.id_club); 
       IF FOUND THEN 
        RETURN NEW; 
       END IF; 
      END IF; 
     END IF; 
    END IF;  
END IF; 
RETURN NULL; 
END; $$ 
LANGUAGE plpgsql; 

CREATE TRIGGER match_partial BEFORE INSERT OR UPDATE ON futbolista 
FOR EACH ROW EXECUTE PROCEDURE match_partial(); 

和表是這個..

-- creacion de la tabla club 

DROP TABLE IF EXISTS club CASCADE; 

CREATE TABLE club (
id_club NUMERIC(10, 0) NOT NULL, 
nom_club VARCHAR(50) NOT NULL, 
ciudad VARCHAR(50) NOT NULL, 
pais VARCHAR(50) NOT NULL 
); 

-- creacion de la tabla futbolista 

DROP TABLE IF EXISTS futbolista CASCADE; 

CREATE TABLE futbolista (
dni NUMERIC(8, 0) NOT NULL, 
nombre VARCHAR(50) NOT NULL, 
apellido VARCHAR(50) NOT NULL, 
id_club NUMERIC(10, 0) DEFAULT 0, 
nom_club VARCHAR(50) DEFAULT 'JUGADOR LIBRE' 
); 

-- se agregan las claves primarias 

ALTER TABLE club ADD CONSTRAINT pk_club PRIMARY KEY (id_club, nom_club); 

ALTER TABLE futbolista ADD CONSTRAINT pk_futbolista PRIMARY KEY (dni); 

的問題是,當我插入一些值 「futbolista」,例如:

(10, 'diego', 'maradona', null, null) 

什麼都沒有發生......你能幫我嗎?謝謝!

ps:抱歉我的英文不好!

+0

BTW:整個觸發器的**意圖**似乎是**冗餘數據**的維護。從futbolista表中刪除nom_club(並且將id_club作爲FK加入俱樂部),您不再需要觸發器。 (你需要以其他方式查找,但這是另一回事) – wildplasser 2013-03-24 12:22:12

回答

1

在看一眼,我看到一對夫婦的實例:

IF NEW.id_club = NULL ... 

可能會有更多的問題,我停止尋找在那裏。
沒有什麼是有史以來NULL相同。改用:

IF NEW.id_club IS NULL ...

確保你理解了NULL值的性質,你去編寫複雜的觸發器之前。基礎知識第一。 Start in the manual here

+0

我會試試這個,非常感謝! 編輯:它似乎工作!再次感謝! – 2013-03-24 02:16:51

+0

@matiaselorriaga當你編寫觸發器時,你會發現'IS DISTINCT FROM'非常有用,因爲'NULL IS DISTINCT FROM NULL'爲false不爲空。 '不是獨立的'也可以。非常方便避免繁瑣的'(一個IS NULL OR a <> b)'一直在測試。 – 2013-03-24 04:44:21