从plpgSQL触发到MySQL

时间:2015-01-02 12:46:23

标签: mysql postgresql triggers

我对触发器有疑问。 我在PostgreSQL的plpgSQL中创建了一个函数,但是现在我需要在MySQL中执行此操作。我几乎尝试了一切,我不知道该如何做到这一点。有人知道该怎么做并帮助我吗?

以下是plpgSQL中的代码:

CREATE OR REPLACE FUNCTION provjera_rezultata() RETURNS TRIGGER AS $$
    DECLARE
    neodigrane_utakmice INT;

    BEGIN
    SELECT COUNT(*) INTO neodigrane_utakmice
    FROM utakmice AS u
        JOIN momcadi AS m1
            ON m1.momcad_ID = u.momcad_a
        JOIN momcadi AS m2
            ON m2.momcad_ID = u.momcad_b
    WHERE rezultat IS NULL;

    IF neodigrane_utakmice > 0 THEN
        RAISE NOTICE 'Broj utakmica bez rezultata je %', neodigrane_utakmice;
    END IF;

    RETURN NEW;
    END;
$$ LANGUAGE plpgsql;

另外,我不知道如何在MySQL中使用PostgreSQL中的“RAISE NOTICE”。

我这样做了,但我收到错误:(

DELIMITER $$

CREATE TRIGGER provjera_rezultata
    AFTER INSERT ON utakmice FOR EACH ROW
    DECLARE broj INTEGER;

BEGIN
    SELECT COUNT(*) INTO broj
    FROM utakmice AS u
        JOIN momcadi AS m1
            ON m1.momcad_ID = u.momcad_a
        JOIN momcadi AS m2
            ON m2.momcad_ID = u.momcad_b
    WHERE rezultat IS NULL;

    IF broj > 0 THEN
        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = 'Postoje utakmice bez konacnog rezultata!';
    END IF;
END $$

2 个答案:

答案 0 :(得分:1)

代码的内部部分可能与它基本相同。

使用CREATE TRIGGER创建触发器。

MySQL中的通知称为signals。你做了

SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'An error occurred'; 

答案 1 :(得分:0)

在MySQL中,您在begin-end内部声明变量。这段代码没有语法错误:

# test tables
CREATE TABLE utakmice(
    momcad_a INT,
    momcad_b INT,
    rezultat INT,
    PRIMARY KEY (momcad_a, momcad_b)
);
CREATE TABLE momcadi(
    momcad_ID INT AUTO_INCREMENT PRIMARY KEY
);


DELIMITER $$
CREATE TRIGGER provjera_rezultata
    AFTER INSERT ON utakmice FOR EACH ROW
BEGIN
    DECLARE broj INTEGER;
    SELECT COUNT(*) INTO broj
    FROM utakmice AS u
        JOIN momcadi AS m1
            ON m1.momcad_ID = u.momcad_a
        JOIN momcadi AS m2
            ON m2.momcad_ID = u.momcad_b
    WHERE rezultat IS NULL;

    IF broj > 0 THEN
        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = 'Postoje utakmice bez konacnog rezultata!';
    END IF;
END $$

我知道这则帖子很旧,但是我不知何故来到了这里,但它没有答案。对于将来的问题,此答案可能会有所帮助。