代码改变世界

Innodb自增主键与sql_mode

2018-10-18 00:07  烟雨楼人  阅读(342)  评论(0编辑  收藏  举报

1.自增主键

1.设置自增主键

建表设置自增主键,设置自增主键需要唯一约束,否则会报错.(即指定列数据唯一)

mysql> create table test_zz(id int auto_increment,name varchar(11),primary key(id));

mysql> create table test_aa(id int auto_increment,name varchar(11),primary key(id))auto_increment=10;

alter设置自增主键:

alter table test_mmm modify id integer auto_increment;

alter table test_jj modify id int auto_increment;

2.自增长参数

 mysql> show variables like '%auto_increment%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 1     |
+--------------------------+-------+
2 rows in set (0.01 sec)

auto_increment_offset 起始值,范围1-65535

auto_increment_increment步长,范围1-65535

说明:

1.在同步配置时,需要将两台服务器的auto_increment_increment增长量都配置为2而要把auto_increment_offset分别配置为12.这样才可以避免两台服务器同时做更新时自增长字段的值之间发生冲突。

2.使用自增长:insert时该字段写为null即可.

 

3.MySQL中MyISAM和innodb自增的区别
MyISAM中,自增值会进行持久化,在数据自增完成后,持久化到磁盘中,而innodb不会进行对应的持久化。自增锁是INNODB比较特殊的锁,因为大多数锁都是在事务完成后自动解除锁定,但是如果自增锁也这样做的话,会大大影响数据库自增的插入性能。因此innodb存储引擎的自增锁是在插入SQL语句完成后立即释放。自增锁之间是不兼容的,就是一个SQL在进行自增插入的时候,另一条SQL需要等待。每个表的自增长值不会进行持久化,而是每次INNODB 重启后去表中查询最大的自增主键值后,将得到的值保存在内存中。
说明:
1.数据库正常运行,删除自增主键最大的一列后再次插入,则自增主键值是在之前最大的值上加步长,而非是删除的主键值。

2.Innodb不持久化自增结果如到了17后删除15,1617,重启数据库后其值为15.

3.MyiSAM 持久化自增结果,如到了17后删除15,1617,重启数据库后其值为18.

 

2.sql_mode

1.查看sql_mode

 sql_mode是个很容易被忽视的变量,默认值是空值(5.6),在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。在生产环境必须将这个值设置为严格模式,所以开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题.

查看当前数据库的sql_mode:(mysql5.7)

mysql> show variables like '%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

5.6sql_mode5.7sql_mode不一样,故升级可能导致有些sql不能用.

2.各种sql_mode的含义

ONLY_FULL_GROUP_BY对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中

NO_AUTO_VALUE_ON_ZERO:该值影响自增长列的插入。默认设置下,插入0NULL代表生成下一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。

STRICT_TRANS_TABLES:在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制

NO_ZERO_IN_DATE:在严格模式下,不允许日期和月份为零

NO_ZERO_DATE:设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。

ERROR_FOR_DIVISION_BY_ZERO:在INSERTUPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL

NO_AUTO_CREATE_USER:禁止GRANT创建密码为空的用户

NO_ENGINE_SUBSTITUTION:如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常.

PIPES_AS_CONCAT:将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似.

ANSI_QUOTES:启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符