【问题标题】:Can MySQL TRIGGER check all INSERT values separetly?MySQL TRIGGER 可以单独检查所有 INSERT 值吗?
【发布时间】:2015-11-07 19:07:16
【问题描述】:

我有一个带表格的简单数据库:Sklep(SklepNazwa,Adres), Towar(TowarNazwa,Producent), Sprzedaz(SklepNazwa,SklepAdres, TowarNazwa,TowarProducent,Cena,Data)

我必须创建TRIGGER,如下所示。

问题是当我尝试一次INSERT 几行时它不起作用。当至少一行触发SIGNAL 时,所有值都将被转储。即使可以插入,也不会插入任何内容。

我可以打电话吗

INSERT INTO Sprzedaz VALUES (...),(...),(...),(...);

有些值可以插入,有些应该失败并显示SIGNAL 消息?

   DELIMITER $$

    CREATE TRIGGER SprzedazInsert 
    BEFORE INSERT ON `Sprzedaz` 
    FOR EACH ROW
    BEGIN

        IF (SELECT COUNT(1) FROM Sprzedaz
            WHERE NEW.SklepNazwa = Sprzedaz.SklepNazwa
            AND NEW.SklepAdres = Sprzedaz.SklepAdres
            AND NEW.TowarNazwa = Sprzedaz.TowarNazwa
            AND NEW.TowarProducent = Sprzedaz.TowarProducent
            AND NEW.Cena = Sprzedaz.Cena
            AND NEW.`Data` = Sprzedaz.`Data`) > 0
        THEN
            SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'INSERT FAILED: Row already exists.';
        ELSE

            IF (SELECT COUNT(1) FROM Sklep WHERE NEW.SklepNazwa = Sklep.SklepNazwa) > 0
            THEN
                IF (NEW.SklepAdres != (SELECT Adres FROM Sklep WHERE NEW.SklepNazwa = Sklep.SklepNazwa))
                THEN
                    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'INSERT FAILED: Wrong "Sklep" data.';
                END IF;
            ELSE
                INSERT INTO `Sklep` (`SklepNazwa`,`Adres`)
                VALUES (NEW.SklepNazwa,NEW.SklepAdres);
            END IF;

            IF (SELECT COUNT(1) FROM Towar WHERE NEW.TowarNazwa = Towar.TowarNazwa) > 0
            THEN
                IF (NEW.TowarProducent != (SELECT Producent FROM Towar WHERE NEW.TowarNazwa = Towar.TowarNazwa))
                THEN
                    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'INSERT FAILED: Wrong "Towar" data.';
                END IF;
            ELSE
                INSERT INTO `Towar` (`TowarNazwa`,`Producent`)
                VALUES (NEW.TowarNazwa,NEW.TowarProducent);
            END IF;
        END IF;

    END$$

【问题讨论】:

  • 并非如此。插入成功或失败——部分成功并不是语言的真正组成部分。您可以通过发出警告来忽略 行无效的行。但是,我猜你可能不需要触发器,对表有正确的约束。
  • 看起来你可以通过声明性约束做很多你想做的事情。

标签: mysql sql triggers insert insert-into


【解决方案1】:

如果您尝试在同一个事务中插入多行,dbms 假定您希望所有插入作为一个组成功或失败。如果您希望行单独成功或失败,则需要在每次插入后提交。

【讨论】:

    猜你喜欢
    • 2011-03-16
    • 2011-09-18
    • 2017-03-24
    • 2017-12-18
    • 1970-01-01
    • 2015-09-18
    • 2011-11-19
    • 2019-01-26
    • 1970-01-01
    相关资源
    最近更新 更多