2013-03-24 109 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