1.自增主键mysql
1.设置自增主键sql
建表设置自增主键,设置自增主键须要惟一约束,不然会报错.(即指定列数据惟一) 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-65535spa auto_increment_increment步长,范围1-65535事务 说明:内存 1.在同步配置时,须要将两台服务器的auto_increment_increment增加量都配置为2,而要把auto_increment_offset分别配置为1和2.这样才能够避免两台服务器同时作更新时自增加字段的值之间发生冲突。 2.使用自增加:insert时该字段写为null便可. |
MyISAM中,自增值会进行持久化,在数据自增完成后,持久化到磁盘中,而innodb不会进行对应的持久化。自增锁是INNODB比较特殊的锁,由于大多数锁都是在事务完成后自动解除锁定,可是若是自增锁也这样作的话,会大大影响数据库自增的插入性能。所以innodb存储引擎的自增锁是在插入SQL语句完成后当即释放。自增锁之间是不兼容的,就是一个SQL在进行自增插入的时候,另外一条SQL须要等待。每一个表的自增加值不会进行持久化,而是每次INNODB 重启后去表中查询最大的自增主键值后,将获得的值保存在内存中。 说明: 1.数据库正常运行,删除自增主键最大的一列后再次插入,则自增主键值是在以前最大的值上加步长,而非是删除的主键值。 2.Innodb不持久化自增结果, 如到了17后删除15,16和17,重启数据库后其值为15. 3.MyiSAM 持久化自增结果,如到了17后删除15,16和17,重启数据库后其值为18. |
2.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.6的sql_mode和5.7的sql_mode不同,故升级可能致使有些sql不能用. |
2.各类sql_mode的含义
ONLY_FULL_GROUP_BY:对于GROUP BY聚合操做,若是在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,由于列不在GROUP BY从句中
NO_AUTO_VALUE_ON_ZERO:该值影响自增加列的插入。默认设置下,插入0或NULL表明生成下一个自增加值。若是用户 但愿插入的值为0,而该列又是自增加的,那么这个选项就有用了。 STRICT_TRANS_TABLES:在该模式下,若是一个值不能插入到一个事务表中,则中断当前的操做,对非事务表不作限制 NO_ZERO_IN_DATE:在严格模式下,不容许日期和月份为零 NO_ZERO_DATE:设置该值,mysql数据库不容许插入零日期,插入零日期会抛出错误而不是警告。 ERROR_FOR_DIVISION_BY_ZERO:在INSERT或UPDATE过程当中,若是数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL NO_AUTO_CREATE_USER:禁止GRANT建立密码为空的用户 NO_ENGINE_SUBSTITUTION:若是须要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常. PIPES_AS_CONCAT:将"||"视为字符串的链接操做符而非或运算符,这和Oracle数据库是同样的,也和字符串的拼接函数Concat相相似. ANSI_QUOTES:启用ANSI_QUOTES后,不能用双引号来引用字符串,由于它被解释为识别符 |