Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
postgresql中的匹配部分实现_Sql_Postgresql_Triggers_Null_Plpgsql - Fatal编程技术网

postgresql中的匹配部分实现

postgresql中的匹配部分实现,sql,postgresql,triggers,null,plpgsql,Sql,Postgresql,Triggers,Null,Plpgsql,我必须为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.n

我必须为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:对不起,我的英语不好

快速浏览一下,我看到以下几个例子:

IF NEW.id_club = NULL ...
可能还有更多问题,我不再看了。
没有任何东西与
NULL
相同。改用:

IF NEW.id_club IS NULL ...
如果NEW.id\u club为空…

在继续编写复杂触发器之前,请确保了解
NULL
值的性质。首先是基础知识

我会试试这个,非常感谢!编辑:这似乎有效!再次感谢@matiaselorriaga您还将发现
不同于
在编写触发器时非常有用,因为
NULL不同于NULL
为false而非NULL
也不一样。非常方便地避免繁琐的
(a为空或a为b)
测试。顺便说一句:整个触发器的目的似乎是维护冗余数据。从futbolista表中删除nom_club(并使id_club成为FK to club),您将不再需要触发器。(您确实需要以其他方式进行查找,但这是另一回事)