这是一个触发程序

时间:2017-08-26 09:01:02

标签: mysql sql database-trigger

DELIMITER $$
CREATE TRIGGER `krishna`.`tbl_venue_BEFORE_INSERT1` BEFORE INSERT ON `tbl_venue` FOR EACH ROW
Begin
if new.ground_name =.ground_name
then
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Cannot add or update row: only one active row allowed per type';
END IF ;
END $$
 DELIMITER ;

我想比较new.ground_name与同一个表中已存在的地名...但是我遇到了语法错误:

  

错误代码:1064。您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在'then SIGNAL SQLSTATE'45000'SET MESSAGE_TEXT ='附近使用正确的语法''无法添加或更新行:仅在第4行

2 个答案:

答案 0 :(得分:0)

语法错误是代码中.ground_name的结果,因为mysql无法解释它。

更广泛的问题是,如果表中已存在该值,则需要通过select进行检查。但是,我只需在ground_name字段上使用唯一索引来防止重复值。它比编写触发器简单得多。

答案 1 :(得分:-1)

鉴于

MariaDB [sandbox]> select * from sports;
+------+------------+
| ID   | Sport      |
+------+------------+
|    1 | Football   |
|    2 | Basketball |
|    3 | Volleyball |
|    4 | Soccer     |
|    5 | Badminton  |
|   11 | Squash     |
+------+------------+
6 rows in set (0.00 sec)

此触发器

DELIMITER $$
CREATE TRIGGER `sandbox`.`tbl_venue_BEFORE_INSERT1` BEFORE INSERT ON `SPORTS`
FOR EACH ROW
Begin
if exists (select * from sports where sport =  new.sport) 
then
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Cannot add or update row: only one active row allowed per type';
END IF ;
END $$
 DELIMITER ;

将在尝试的重复插入上抛出错误。 正如影子所说,这可以通过一个独特的索引来处理。请注意使用if exists来检查重复项。 由于错误消息没有多大意义,因为触发器只会在插入时触发,如果需要检查更新,则还需要编写更新触发器。您还应该注意,如果批量插入中的任何单个插入都是重复的,那么批量插入中传递的所有值都将被拒绝 - 您可能希望使用错误日志而不是简单拒绝所有进程来处理此问题。