alter table questionlib modify id?int(11) auto_increment;
注意事项:
修改后从下一条记录开始自动增长.如果想让原来的自动增长就得复制现有表的结构(无id),添加id并加上AUTO_INCREMENT,然后通过循环,添加n条空记录,然后对应先前表的id,依次插入数据.
扩展资料:
mysql自动增长开始值设置总结
①.、创建表,设置表主键id自动增长,默认自动增长的起始值为1开始.
如果你数据库已经建立 用这个方法:
ALTER TABLE +test+ CHANGE +id+ +id+ INT(11) NOT NULL AUTO_INCREMENT;
如果你数据库没有建立 ?就用CREATE :
如果你用的数据库软件 比如Navicat for MySQL. ?那么在设计表选项里有设置自动增长的,打上勾
①? 通过auto_increment关键字来指定自增的列,并指定自增列的初始值为1.
首先:表中自增列的上限是根据自增列的字段类型来定的.
若设定了自增id充当主键,当达到了自增id的上限值时,会发生什么样的事情呢?还是以上面创建的 t表为例, 先回顾它的表结构:
CREATETABLE +t+ (
+id+ int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (+id+)
QueryOK, 0 rows affected (0.01 sec)
Records:0? Duplicates: 0? Warnings: 0
QueryOK, 1 row affected (0.01 sec)
对于写入量大,且经常删除数据的表,自增id设为int类型还是偏小的,所以我们为了避免出现自增id涨满的情况,这边统一建议自增id的类型设为unsigned bingint,这样基本可以保障表的自增id是永远够用的.
这里内容比较多,innodb是索引组织表,所以涉及到索引的知识,但这不是本文的重点,我们快速回顾索引知识:
①? Innodb索引分为主键跟辅助索引,主键即全表,辅助索引叶子节点保存主键的值,而主键的叶子节点保存数据行,中间节点存着叶子节点的路由值.
其实能够理解索引的结构及索引写入插入、更新的原理,则自然就明白为何建议使用自增id.这里我直接列出使用自增id 当主键的好处吧:
①? 顺序写入,避免了叶的分裂,数据写入效率好
容易出现不连续的id
自增id的修改机制如下:
在MySQL里面,如果字段id被定义为AUTO_INCREMENT,在插入一行数据的时候,自增值的行为如下:
① 如果插入数据时id字段指定为0、null 或未指定值,那么就把这个表当前的
AUTO_INCREMENT值填到自增字段;
根据要插入的值和当前自增值的大小关系,自增值的变更结果也会有所不同.假设,某次要插入的值是X,当前的自增值是Y.
① 如果XY,那么这个表的自增值不变;
新的自增值生成算法是:从auto_increment_offset开始,以auto_increment_increment为步长,持续叠加,直到找到第一个大于X的值,作为新的自增值.
Insert、update、delete操作会让id不连续.
Delete、update:删除中间数据,会造成空动,而修改自增id值,也会造成空洞(这个很少).
Insert:插入报错(唯一键冲突与事务回滚),会造成空洞,因为这时候自增id已经分配出去了,新的自增值已经生成,如下面例子:
+----+------+
| id | name |
|? 1| aaa? |
+----------------+
| Auto_increment |
①. row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
①. row in set (0.01 sec)
可以看到,虽然事务回滚了,但自增id已经回不到从前啦,唯一键冲突也是这样的,这里就不做测试了.
在批量插入时(insert select等),也存在空洞的问题.看下面实验:
①? 语句执行过程中,第一次申请自增id,会分配1个;
①.:mysql的默认设置.普通的insert语句申请后立马释放,insert select、replace insert、load data等批量插入语句要等语句执行结束后才释放,并发读得到提升
在彻底了解了MYSQL的自增机制以后,在实际生产中就能灵活避坑,这里建议不要用自增id值去当表的行数,当需要对大表准确统计行数时,可以去count(*)从库,如果业务很依赖大表的准确行数,直接弄个中间表来统计,或者考虑要不要用mysql的innodb来存储数据,这个是需要自己去权衡.另外对于要求很高的写入性能,但写入量又比较大的业务,自增id的使用依然存在热点写入的问题,存在性能瓶颈,这时候可通过分库分表来解决.
看你的表没有适合做自增的列呀?
另外科普一下别再叫这个是DOS命令了.一眼被看出是门外汉.至少要交SQL语句.
你这个是DDL语句
SQL语句分类
.DDL(Data?Definition?Languages)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象.常用的语句关键字主要包括create、drop、alter等.
.DML(Data?Manipulation?Languages)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性.常用的语句关键字主要包括insert、delete、update和select等.
.DCL(Data?Control?Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句,这些语句定义了数据库、表、字段、用户的访问权限和安全级别,主要的语句关键字包括grant、revoke等.
关于自增长主键关键字是AUTO_INCREMENT,在定义时加上就ok了
先加个id吧
/*添加id*/
alter?table?+Student+.+id+?add?column?+id+?int(11)?NULL;
/*设置自增*/
alter?table?+Student+.+id+?change?+id+?+id+?int(11)?NOT?NULL?AUTO_INCREMENT,?add?primary?key(+id+);
/*创建表时定义*/
CREATE?TABLE?+test+?(????
+id+?int(11)?NOT?NULL?AUTO_INCREMENT,?
+name+?varchar(100)?DEFAULT?NULL,?
UNIQUE?KEY?+id+?(+id+)????
)