MySQL 添加触发器抛错 `SUPER privilege and binary logging is enabled `
当在启用二进制日志记录的MySQL服务器上添加触发器时,可能会遇到以下错误消息:"SUPER privilege and binary logging is enabled"。这是由于MySQL的安全性配置限制导致的。在启用二进制日志记录的情况下,只有拥有"SUPER"特权的用户才能创建触发器。这是为了确保在二进制日志中记录的事件可以正确地进行复制和回放。
要解决这个问题,有几种方法可以尝试:
- 使用具有"SUPER"特权的用户登录:使用具有"SUPER"特权的用户(如root用户)登录MySQL,并执行创建触发器的操作。这些特权用户可以绕过安全限制。
禁用二进制日志记录:如果您的应用程序不依赖于二进制日志记录功能,可以尝试禁用二进制日志记录,然后再添加触发器。要禁用二进制日志记录,您可以在MySQL配置文件中找到以下行并进行注释:
#log_bin = /path/to/binlog
注释掉该行后,重新启动MySQL服务器。
请注意,禁用二进制日志记录可能会影响到数据恢复和复制的能力。在做出决定之前,请确保了解可能带来的潜在影响。
- 请求管理员权限:如果您不是具有"SUPER"特权的用户,您可以联系MySQL管理员或具有"SUPER"特权的用户,请求其帮助您添加触发器。
无论您选择哪种方法,请确保在进行任何更改之前备份重要的数据库和数据。这将帮助您在出现问题时恢复到以前的状态。
MySQL命令行中创建触发器要注意的问题
触发器创建语法:
create trigger 触发器名before/after insert/delete/update on 表名for each row
begin
SQL语句
end;

在MySQL终端中,使用上述语法时会报错,因为SQL语句末尾需要加分号; ,但是终端中一旦出现分号,系统就认为触发器创建结束,导致出错,所以需要在使用前修改系统默认的结束标记,例如//
delimiter //
create trigger 触发器名 before/after insert/delete/update on 表名for each row
begin
SQL语句
end//

这样在SQL语句中的分号就不会认为是触发器创建完毕,只有遇到指定结束符才完成触发器的创建。
Mysql 如何解决 BIGINT UNSIGNED value is out of range
今天有一个之前常发生的sql 错误 BIGINT UNSIGNED value is out of range , 错误常见但一直没百度查.
这个月初出了同样的问题. 记录下 水一下博客.
问题场景 . 查询SQL
表结构
CREATE TABLE `table1` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`tim1` int(11) NOT NULL DEFAULT '0' COMMENT '时间1',
`tim2` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '无符号 时间2',
PRIMARY KEY (`trade_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
问题语句
select * from table1 where (time1 - time2) > 10;
光看上一条没问题, 但如果 time1 小于 time2 就出了问题了, 原因在于time2 设置了unsigned .
mysql 当两个字段想减时,如果其中一个或两个字段的类型的unsigned无签名类型,如果想减的值小于0则会报错(BIGINT UNSIGNED value is out of range)
解决办法:
一、修改字段类型
二、使用cast函数转字段为signed类型
select * from table1 where time1 - cast(time2 as signed)