这两个变量都有session级和global级。其中auto_increment_offset项为起始计算项,auto_increment_increment项为步长项。它们的处理模式和SQL server的处理方式相差甚远。当同时设置了这两个变量时,如果offsert设置的值大于increment的值,则offset将被忽略,且MySQL会以"offset+N\*increment"计算下一条插入的记录值。例如,"offset=3、increment=5",当前表的最后一个自增列值为13,则下一条插入的自增值为18,因为"offset+N\*increment"将计算得到[3,8,13,18,23,28...]序列,所以从序列中挑出大于且最接近当前最后一个值13的项,即18。
以上言论为官方手册上的解释(原文:the next value inserted is the least value in the series that is greater than the maximum existing value in the AUTO_INCREMENT column),但实际上并不标准,更准确的说法是:根据当前offset和increment计算增长序列,并从中挑出大于或等于原序列的下一个值。例如上面offset=3,生成的序列为[3,8,13,18,23...],下一个要插入的值为18,但插入之前如果将offset改为4,则新的序列为[4,9,14,19,24],那么它将插入19,而不是14,尽管14大于当前最后一个记录值13。同理,如果将offset改小,例如设置为2,则序列为[2,7,12,17,22],那么下一个插入的值将是22。同理,修改increment也是一样计算的。
问:如果有一张表,里面有个字段为id的自增主键,当已经向表里面插入了10条数据之后,删除了id为8、9、10的数据,再把mysql重启,之后再插入一条数据,那么这条数据的id值应该是多少,是8还是11?
答:是11。但是在老版本中,innodb存储引擎的表会是8,这是innodb的bug,在后来修复了,只是在mysql5.6中没有了。
查看当前自增值的方法:
show table status like "table_name_string"; -- 查看某个表的下一个自增值 select last_insert_id(); -- 查看当前环境下最后一次自增列的插入值关于"last_insert_id"函数,在下一篇文章"内置函数"中再做介绍。
1.4 查看表的属性 -- SQL Server使用存储过程sp_help exec sp_help emp; -- MySQL使用desc描述或者使用show mysql> desc emp1; +-------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | +-------+---------+------+-----+---------+----------------+ mysql> show table status like 'emp1'\G *************************** 1. row *************************** Name: emp1 Engine: InnoDB Version: 10 Row_format: Compact Rows: 1 Avg_row_length: 16384 Data_length: 16384 Max_data_length: 0 Index_length: 0 Data_free: 0 Auto_increment: 2 Create_time: 2017-03-22 10:05:49 Update_time: NULL Check_time: NULL Collation: latin1_swedish_ci Checksum: NULL Create_options: Comment: 1 row in set (0.00 sec) 1.5 修改表名 -- SQL Server使用存储过程sp_rename EXEC sp_rename emp,emp2 [object] -- mysql使用alter语句中的rename功能 alter table emp rename [to] emp3; 1.6 删除表在删除表方面,MySQL比SQL Server要方便很多,判断起来也方便很多。
-- SQL Server删除表,每次只能删除一张表 if object_id('table_name') is not null drop table table_name; if exists(select object_id('table_name')) drop table table_name; -- MySQL可以直接判断,且一次可以删除多表 drop table if exists table_name1,table_name2... 1.7 修改字段属性 -- SQL Server只能修改字段属性(数据类型、空性),不能修改约束类属性, -- 约束类属性需要使用"alter table … add constraint" alter table emp2 alter column id int not null; alter table emp2 add gender char(2); alter table emp2 add CONSTRAINT def_key DEFAULT('男') FOR gender; alter table emp2 add constraint pk_key primary key clustered(id); -- mysql修改字段属性有几种方法 alter table table_name | ALTER [COLUMN] col_name {SET DEFAULT string | DROP DEFAULT} | CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name] | MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]