安全7.13

严格模式下导致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 ;
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值