严格模式下导致mysql5.7插入用户表的方式新建用户失败,那么如何修改严格模式,让他插入成功。
失败时出错SQL语句:
alter table supervise_note add audit_at TIMESTAMP:
原因:
MySQL5.7将默认的 sql_mode 从“松散模式”更改为“严格模式”。
我们通过SQL语句mysql> select @@sql_mode;
查询出 sql_mode ,发现其中有 NO_ZERO_IN_DATE,NO_ZERO_DATE。sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
即为不允许 TIMESTAMP 值为 0000-00-00 00:00:00。
我们再通过 SQL 语句mysql> show variables;
查询出 MySQL5.7 的 explicit_defaults_for_timestamp 默认值为 OFF ,这与 sql_mode 的 NO_ZERO_DATE 也是相冲突的。explicit_defaults_for_timestamp = OFF
解决方案mysql> set @@explicit_defaults_for_timestamp = 1;
1.此时如果 TIMESTAMP 列没有显示的指定 not null 属性,那么默认的该列可以为 null ,此时向该列中插入 null 值时,会直接记录 null 。
2.如果 TIMESTAMP 列被加上了 not null 属性,并且没有指定默认值。这时如果向表中插入记录,但是没有给该 TIMESTAMP 列指定值的时候,如果 strict sql_mode 被指定了,那么会直接报错。如果 strict sql_mode 没有被指定,那么会向该列中插入 ’0000-00-00 00:00:00’ 并且产生一个 warning 。
去掉sql_mode中的 NO_ZERO_IN_DATE,NO_ZERO_DATE 。
SQL语句:mysql> set @@sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
这里也可修改 MySQL 配置文件来去除规则,没有配置文件在 /etc/mysql 下创建 my.cnf 配置文件sudo vi /etc/mysql/my.cnf
在 [mysqld] 区域添加:sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
将all改为select权限,并且将*.*改为指定数据库
grant all on security.* to xacxxy@127.0.0.1 identified by 'xacxxy218'; grant a11 on *.* to 'yinke'@'%’ identified by 'yinke123';
mysql赋权操作:
GRANT:赋权命令
ALL PRIVILEGES:当前用户的所有权限
ON:介词
*.*:当前用户对所有数据库和表的相应操作权限
TO:介词
‘root’@’%’:权限赋给root用户,所有ip都能连接
IDENTIFIED BY ‘123456’:连接时输入密码,密码为123456
WITH GRANT OPTION:允许级联赋权
16kb page目前而言,是否可以修改
是可以修改的,但是只能在mysql实例产生之前对innodb_page_size参数进行修改配置,否则将不可修改。如果没有指定值,则使用默认页面大小初始化实例,如果在mysql实例产生前没有规定innodb_page_size,则会以默认的16KB作为page大小。
触发器
触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,例如当对一个表进行操作( insert,delete, update)时就会激活它执行。
1. 四要素
监视地点(table)
监视事件(insert/update/delete)
触发时间(after/before)
触发事件(insert/update/delete)
2 .触发器语法
DELIMITER $
create trigger triggerName
after/before insert/update/delete on 表名
for each row #这句话在mysql是固定的
begin
sql语句;
end
DELIMITER ;
3. Insert触发器
DELIMITER $
CREATE TRIGGER ins_stu1
AFTER INSERT ON student FOR EACH ROW
BEGIN
INSERT INTO cj(num,stu_id,stu_name,math,chinese,english)VALUES(2,new.stuid,new.username,999,88,88);
END$
DELIMITER ;
存储过程
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
1 创建一个简单的存储过程
USE test;
DELIMITER $
CREATE PROCEDURE testa()
BEGIN
SELECT * FROM student;
SELECT * FROM cj;
END $
DELIMITER ;
1.1 调用存储过程
CALL test2();
2 存储过程的变量
DELIMITER $
CREATE PROCEDURE test2()
BEGIN
#声明变量类型
DECLARE un VARCHAR(32) DEFAULT '';
#给username变量赋值
SET un='xiaoxiao';
#讲查询结果赋值给un变量
SELECT username INTO un FROM student WHERE stuid=3;
#查询un变量,返回
SELECT un;
END $
DELIMITER ;
3 变量的作用范围
DELIMITER $
CREATE PROCEDURE test3()
BEGIN
BEGIN
#声明变量类型
DECLARE un VARCHAR(32) DEFAULT '';
#给username变量赋值
SET un='xiaoxiao';
#讲查询结果赋值给un变量
SELECT username INTO un FROM student WHERE stuid=3;
#查询un变量,返回
SELECT un;
END;
BEGIN
#声明变量类型
DECLARE un VARCHAR(32) DEFAULT '';
#给username变量赋值
SET un='xiaoxiao';
#讲查询结果赋值给un变量
SELECT username INTO un FROM student WHERE stuid=5;
#查询un变量,返回
SELECT un;
END;
END $
DELIMITER ;