Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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
Mysql 如何防止通过触发器插入到表中?_Mysql_Sql_Database_Triggers - Fatal编程技术网

Mysql 如何防止通过触发器插入到表中?

Mysql 如何防止通过触发器插入到表中?,mysql,sql,database,triggers,Mysql,Sql,Database,Triggers,当颜色为红色的行数超过100行时,我必须防止插入到表中。这是我写的代码,只是不知道在空白处写什么。 CREATE TRIGGER onRegisterInsert BEFORE INSERT ON table_name FOR EACH ROW BEGIN DECLARE n INT DEFAULT 0; IF New.Colour='Red' THEN SELECT COUNT(*) INTO n FROM table_name WHERE Colour='Re

当颜色为红色的行数超过100行时,我必须防止插入到表中。这是我写的代码,只是不知道在空白处写什么。

CREATE TRIGGER onRegisterInsert BEFORE INSERT ON table_name FOR EACH ROW
BEGIN
    DECLARE n INT DEFAULT 0;
    IF New.Colour='Red' THEN
        SELECT COUNT(*) INTO n FROM table_name WHERE Colour='Red';
        if n > 100 THEN
          ---
        END IF
    END IF
END
我想写
SIGNAL SQLSTATE'45000'
来防止插入,但我不想抛出错误,因为我正在插入一个数据列表,如果抛出错误,在此之后插入的数据也将停止

我还考虑过编写一个后插入触发器,而不是前插入触发器

DELIMITER //
CREATE TRIGGER onRegisterInsert After INSERT ON table_name FOR EACH ROW
BEGIN
    IF New.Colour='Red' THEN
        SELECT COUNT(*) INTO @count FROM table_name WHERE Colour='Red';
        IF (@count >= 100) THEN
        delete from table_name new;
        END IF;
    END IF;
END //

但这段代码也给出了一个错误

您可以在调用应用程序中使用
INSERT IGNORE
而不是
INSERT

我不认为MySQL提供了“而非”触发器。也许,在插入后的
中,您可以使用
delete from table\u name,其中id=new.id
(将
id
替换为表的实际pk)无法阻止仅从整个数据数组插入一条记录。插入全部或弹出整个插入。是的,这可能会解决。。。此外,插入前触发器必须将错误记录的PK(或任何唯一列/表达式)值更改为任何现有记录的值。但这必须经过测试…方法是正确的!跟踪信息。