Sql 在MariaDB上创建事务以设置ip黑名单的到期时间

Sql 在MariaDB上创建事务以设置ip黑名单的到期时间,sql,mariadb,Sql,Mariadb,我用来帮助构建此事务的问题如下: 我正试图在我的数据库中创建一个事务,以填写我的mariadb数据库表黑名单\u ips中的allowed列。我希望allowed列在我添加的列后一小时,该列的默认值为CURRENT\u TIMESTAMP。以下是我目前的交易记录: CREATE TRIGGER before_insert_on_blacklisted_ips BEFORE INSERT ON blacklisted_ips FOR EACH ROW BEGIN SET NEW.allowed=

我用来帮助构建此事务的问题如下:

我正试图在我的数据库中创建一个事务,以填写我的mariadb数据库表
黑名单\u ips
中的
allowed
列。我希望
allowed
列在我添加的
列后一小时,该列的默认值为
CURRENT\u TIMESTAMP
。以下是我目前的交易记录:

CREATE TRIGGER before_insert_on_blacklisted_ips BEFORE INSERT ON blacklisted_ips FOR EACH ROW BEGIN
SET NEW.allowed=NOW()+INTERVAL 1 HOUR;
END;
我收到的错误消息如下:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 2
这是我的表模式:

CREATE TABLE blacklisted_ips (
    ip_id int(11) NOT NULL AUTO_INCREMENT,
    ip_add varchar(15) NOT NULL,
    added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    allowed timestamp NOT NULL,
    PRIMARY KEY (ip_id)
);

在MySQL中,
之间存在歧义创建触发器
语句的code>,以及可能的
终止触发器主体中单个语句的字符

您得到的错误令人困惑:

#1064-您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以获取第2行“”附近要使用的正确语法

通常,语法错误包括语法分析器混淆位置后面的语句文本。但在你的例子中,它在
处变得混乱
,认为这是
CREATE TRIGGER
语句的结尾。因此,错误发生在终止时;就解析器而言,错误后没有文本

同样的问题影响
创建过程
创建功能

为了修复歧义,MySQL客户端支持更改分隔符,因此您可以将其更改为与例程主体中出现的任何字符序列不同的内容

DELIMITER ;;
CREATE TRIGGER before_insert_on_blacklisted_ips BEFORE INSERT ON blacklisted_ips 
FOR EACH ROW BEGIN
  SET NEW.allowed=NOW()+INTERVAL 1 HOUR;
END ;;
或者,因为在您的情况下触发器是单语句触发器,所以根本不需要
BEGIN…END
块。这样,您可以跳过更改分隔符,因为
创建触发器的
是相同的

CREATE TRIGGER before_insert_on_blacklisted_ips BEFORE INSERT ON blacklisted_ips 
FOR EACH ROW
  SET NEW.allowed=NOW()+INTERVAL 1 HOUR;

注意:这里有一个例子记录了这一点:

可能重复的@BillKarwin的可能重复。你完全正确,这是因为我缺少分隔符,但这一点还不清楚,因为很难看到任何例子都没有显示触发器。如果你想回答的话,我很乐意给你这个问题的答案