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