Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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触发器中出现错误1054_Mysql_Triggers_Mysql Error 1054 - Fatal编程技术网

MySQL触发器中出现错误1054

MySQL触发器中出现错误1054,mysql,triggers,mysql-error-1054,Mysql,Triggers,Mysql Error 1054,这是我的扳机 DELIMITER // CREATE TRIGGER verificare_masa BEFORE INSERT ON Rezervare FOR EACH ROW BEGIN IF (NEW.Data_Rezervarii=Data_Rezervarii) AND (NEW.NumarMasa=NumarMasa) THEN SET NEW.NumarMasa= NULL; END IF; END // DELIMITER ; 我想在1号桌上触发rezervar

这是我的扳机

DELIMITER //
CREATE TRIGGER verificare_masa
BEFORE INSERT ON Rezervare
FOR EACH ROW 
BEGIN
IF (NEW.Data_Rezervarii=Data_Rezervarii) AND (NEW.NumarMasa=NumarMasa) THEN 
    SET NEW.NumarMasa= NULL;

END IF;
END //
DELIMITER ;
我想在1号桌上触发rezervare

当我执行触发器时,它已被创建。但是,当我将数据插入表rezervare时,它就变成了 错误代码:1054。“字段列表”中的未知列“数据”

我想检查数据库中是否已存在该日期的预订
并且已为该日期保留了所需的质量

从您的尝试中,似乎仍希望插入具有相同数据的新行,但NumarMasa NULL。如果是这样,你的触发器应该是

CREATE TRIGGER verificare_masa 
BEFORE INSERT ON Rezervare FOR EACH ROW 
SET NEW.NumarMasa = IF(EXISTS(
  SELECT 1 FROM Rezervare 
  WHERE Data_Rezervarii=NEW.Data_Rezervarii 
    AND NumarMasa = NEW.NumarMasa
  ),NULL,NEW.NumarMasa);
然后它会像这样工作:

MariaDB [test]> select * from Rezervare;
+-----------------+-----------+
| Data_Rezervarii | NumarMasa |
+-----------------+-----------+
| 2016-12-12      |         1 |
| 2016-12-12      |         2 |
| 2016-12-13      |         3 |
+-----------------+-----------+
3 rows in set (0.00 sec)

MariaDB [test]> INSERT INTO Rezervare VALUES ('2016-12-12',1),('2016-12-12',4);
Query OK, 2 rows affected (0.20 sec)
Records: 2  Duplicates: 0  Warnings: 0

MariaDB [test]> select * from Rezervare;
+-----------------+-----------+
| Data_Rezervarii | NumarMasa |
+-----------------+-----------+
| 2016-12-12      |         1 |
| 2016-12-12      |         2 |
| 2016-12-13      |         3 |
| 2016-12-12      |      NULL |
| 2016-12-12      |         4 |
+-----------------+-----------+
5 rows in set (0.00 sec)

但是,如果您确实希望在表中已经存在新记录的情况下完全跳过该记录,则应通过在这两列上添加唯一索引并使用INSERT IGNORE来完成该操作。

从您的尝试来看,您似乎仍然希望插入具有相同数据的新行,但NumarMasa NULL为空。如果是这样,你的触发器应该是

CREATE TRIGGER verificare_masa 
BEFORE INSERT ON Rezervare FOR EACH ROW 
SET NEW.NumarMasa = IF(EXISTS(
  SELECT 1 FROM Rezervare 
  WHERE Data_Rezervarii=NEW.Data_Rezervarii 
    AND NumarMasa = NEW.NumarMasa
  ),NULL,NEW.NumarMasa);
然后它会像这样工作:

MariaDB [test]> select * from Rezervare;
+-----------------+-----------+
| Data_Rezervarii | NumarMasa |
+-----------------+-----------+
| 2016-12-12      |         1 |
| 2016-12-12      |         2 |
| 2016-12-13      |         3 |
+-----------------+-----------+
3 rows in set (0.00 sec)

MariaDB [test]> INSERT INTO Rezervare VALUES ('2016-12-12',1),('2016-12-12',4);
Query OK, 2 rows affected (0.20 sec)
Records: 2  Duplicates: 0  Warnings: 0

MariaDB [test]> select * from Rezervare;
+-----------------+-----------+
| Data_Rezervarii | NumarMasa |
+-----------------+-----------+
| 2016-12-12      |         1 |
| 2016-12-12      |         2 |
| 2016-12-13      |         3 |
| 2016-12-12      |      NULL |
| 2016-12-12      |         4 |
+-----------------+-----------+
5 rows in set (0.00 sec)

但是,如果您确实希望在表中已经存在新记录的情况下完全跳过该记录,则应该通过在这两列上添加唯一索引并使用INSERT IGNORE来完成。

我使用了您的代码错误代码:1193。未知系统变量“NumarMasa”请粘贴SHOW CREATE TABLE Rezervare\G、SHOW CREATE TRIGGER verificate\u masa\G和SHOW变量“%version%”的输出。很可能你错过了新的赛后设置-如果你尝试设置NumarMasa=,你会得到这个确切的错误…我解决了这个问题,因此:分隔符//在开始为每行插入预订前创建触发器VerificateCare\u masa,如果从Reservation NEW.Data\u Rezervarii=Data\u Rezervarii=Data和NEW.NumarMasa=NumarMasa=1处选择Count*,则设置NEW.NumarMasa=NULL;如果结束;结束//分隔符;我用了你的代码错误代码:1193。未知系统变量“NumarMasa”请粘贴SHOW CREATE TABLE Rezervare\G、SHOW CREATE TRIGGER verificate\u masa\G和SHOW变量“%version%”的输出。很可能你错过了新的赛后设置-如果你尝试设置NumarMasa=,你会得到这个确切的错误…我解决了这个问题,因此:分隔符//在开始为每行插入预订前创建触发器VerificateCare\u masa,如果从Reservation NEW.Data\u Rezervarii=Data\u Rezervarii=Data和NEW.NumarMasa=NumarMasa=1处选择Count*,则设置NEW.NumarMasa=NULL;如果结束;结束//分隔符;