mysql数据库⾃增_mysql数据库⾃增id⽤法⼤全在mysql数据库中,使⽤auto_increment 字段来辅助为⾃增列赋值。
显⽰有关msyql⾃增ID的相关配置信息:
复制代码 代码⽰例:
SHOW VARIABLES LIKE 'auto_incre%';
输出:
auto_increment_increment 1
auto_increment_offset 1
说明:
auto_increment_increment  = 1 ,每次插⼊数据,id++;auto_increment_offset =1 ,说明从1开始。
mysql面试题大全>kettle日志写入数据库破解plsql⼀般情况下auto_increment_increment=1,auto_increment_offset=1.是默认初始值。
可以在myf⽂件中进⾏重新指定。auto_increment满⾜⼀个数学当纳法推导公式:
value=auto_increment_increment*N+auto_increment_offset
表中有auto_increment列,innodb⽤⼀种锁策略来保正这个auto_increment列值。
如果创建⼀个表,指定了auto_increment表。那么innodb会维护⼀个auto_increment计数器。
当访问这个计数器,innodb会使⽤表级锁来锁定这访问过程,这个发⽣在分析auto_increment
值的过程中,⽽不是在⼀个执⾏事务中。也就是说:这个访问发⽣在事务执⾏前⾯。
所以和这个锁不是发⽣整个事务过程中,仅仅是分析语句判断出auto_increment这⼀过程中。
auto_increment计数器,⼀直维护在内存中,当server重启或是停⽌后重启,innodb会为每个表初始化这个计数器。
对⼀个含有⾃增列(通常为id)的表执⾏
mysql> SHOW CREATE TABLE table_name;
输出:
复制代码 代码⽰例:
CREATE TABLE `news` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`url` varchar(255) NOT NULL,
`pub_date` datetime NOT NULL,
`site` tinyint(4) NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime DEFAULT NULL,
`org` varchar(255) DEFAULT NULL,
`author` varchar(255) DEFAULT NULL,
`trend` tinyint(4) DEFAULT '-1',
`md5url` char(32) NOT NULL,
`content` longtext NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `md5url` (`md5url`),
KEY `pub_date` (`pub_date`),
KEY `created_at` (`created_at`),
KEY `title` (`title`)
) ENGINE=InnoDB AUTO_INCREMENT=704677 DEFAULT CHARSET=utf8web服务器搭建 linux
其中该状态下,表中AUTO_INCREMENT 字段值为704677 ,说明下⼀个插⼊的id 为704677 ,同时插⼊成功
后,AUTO_INCREMENT=704678。
mysql 数据库中的id设为⾃增,容易产⽣id不连续的问题。
有时将⼀个表中的所有数据清除,但是在插⼊数据时,id还是在未清除前的基础上累加。
需要解决如下问题:
1. 删除数据,同时要求再次插⼊数据时,id从1 开始累计
复制代码 代码⽰例:
1)、TRUNCATE TABLE table_name;
2)、DELETE FROM table_name;
ALTER TABLE table_name auto_increment =1 ;
分析:
Truncate table 表名 速度快,⽽且效率⾼,因为:TRUNCATE TABLE 在功能上与不带 WHERE ⼦句的 DELETE 语句相同:⼆者均删除表中的全部⾏。
但是,TRUNCATE TABLE ⽐ DELETE 速度快,且使⽤的系统和事务⽇志资源少。DELETE 语句每次删除⼀⾏,并在事务⽇志中为所删除的每⾏记录⼀项。TRUNCATE TABLE 通过释放存储表数据所⽤
数据分析的数据可以是
的数据页来删除数据,并且只在事务⽇志中记录页的释放。
TRUNCATE TABLE 删除表中的所有⾏,但表结构及其列、约束、索引等保持不变。新⾏标识所⽤的计数值重置为该列的种⼦。如果想保留标识计数值,请改⽤ DELETE。如果要删除表定义及其数据,请使⽤ DROP TABLE 语句。
2,查看当前状态下⼀个表的auto_increment 值:
SHOW TABLE STATUS LIKE 'table_name'输出:
Name: ddx
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 2449
Avg_row_length: 93
Data_length: 229376
Max_data_length: 0
Index_length: 114688
Data_free: 0viewing workshop什么意思
Auto_increment: 2353
Create_time: 2012-05-02 12:54:55
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
可以查看该表当前的Auto_increment的值。
3,对有些失败插⼊操作,如果不是语法错误,⽐如重复的唯⼀键值,也会造成⾃增id的不连续。
4,mysql5.1.22之前,innodb使⽤⼀个表锁解决⾃增字段的⼀致性问题(内部是⽤⼀个计数器维护,每次⾃增时要加表锁),如果⼀⾏⼀⾏的插⼊数据则没有什么问题,但是如果⼤量的并发插⼊就废了,表锁会引起SQL堵塞,不但影响效率,⽽且可能会瞬间达到
max_connections⽽崩溃。
在 5.1.22之后,innodb使⽤新的⽅式解决⾃增字段⼀致性问题,对于可以预判⾏数的insert语句,innodb使⽤⼀个轻量级的互斥量。如:某⼀insert语句1执⾏前,表的AUTO_INCREMENT=1,语句1的插⼊⾏数已知为3,innodb在语句1的实际插⼊操作执⾏前就预分配给该语句三个⾃增值,当有⼀个新的insert语句2要执⾏时,读取的AUTO_INCREMENT=4,这样虽然语句1可能还没有执⾏完,语句2就可直接执⾏⽆需等待语句2。
这种⽅式对于可预判插⼊⾏数的插⼊语句有效,如:insert和replace。对于⽆法提前获知插⼊⾏数的语句,如:、和load data则innodb还是使⽤表锁。
insert语句中有时会显⽰的设置⾃增字段的值,对于这种情况innodb还是会预分配给语句总⾏数的⾃增值⽽不是只有实际使⽤系统⾃增的⾏。因⽽有可能会造成⾃增字段的值不连续。
例如:
INSERT INTO t1 (c1,c2) VALUES (1,'a'), (NULL,'b'), (5,'c'), (NULL,'d'); c1 为⾃增字段,实际的AUTO_INCREMENT 会⼤2。
设置新⾃增互斥⽅式:
通过配置选项:innodb_autoinc_lock_mode,它是专门⽤来在使⽤auto_increment的情况下调整锁策略的。
⽬前有三种选择:
innodb_autoinc_lock_mode = 0 (“traditional” lock mode:全部使⽤表锁)
innodb_autoinc_lock_mode = 1 (默认)(“consecutive” lock
mode:可预判⾏数时使⽤新⽅式,不可时使⽤表锁)
innodb_autoinc_lock_mode = 2 (“interleaved” lock
mode:全部使⽤新⽅式,不安全,不适合replication)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。