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行
答案 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来检查重复项。 由于错误消息没有多大意义,因为触发器只会在插入时触发,如果需要检查更新,则还需要编写更新触发器。您还应该注意,如果批量插入中的任何单个插入都是重复的,那么批量插入中传递的所有值都将被拒绝 - 您可能希望使用错误日志而不是简单拒绝所有进程来处理此问题。