mysql数据库主键设置了自增,但是,我把删除了一些数据,随后加的数据为什么会自增ID会接着已经删除了的?
这是因为你设置的主键自增策略中就是每次增二。其实在建表语句中主键字段设置autoincrement就可以了,当然建表以后也可以使用alte语句,实现自增一的效果。
MySQL中被其他表外键引用的字段为什么不能添加主键自增?
一个表的外键必须是另外一个表的主键 每一个表不是必须得有一个自增主键id的,比如学生表,可以设置学号为主键,这样在选课表中可以设置学号为外键,引用学生表中的学号
新人求助,为何mysql中主键出现了重复?
要回答这个问题首先必须了解主键的定义:
主关键字(primary key)是表中的一个或多个字段,它的值用于
惟一地
标识表中的某一条记录。主关键字是一种唯一关键字
,表定义的一部分
。一个表不能有多个主关键字,并且主关键字的列不能包含空值
。数据库开发过程中的一个原则是不应该使用主键来储存“内容”。URL地址并不唯一,可能出现“?”或者“&”甚至于引号等非常规字符,有些字符在改写为URL时还会被转译(例如人民→“%E4%BA%BA%E6%B0%91”),并且有些网站会在URL中添加无意义的随机字符。这些情况使得储存URL的字段会发生重复、不可索引、空值的情况,应当极力避免。应该使用主键来储存“索引”,例如学生的学号,职员的工号,居民身份证号码等等唯一的字符串。如果在设计数据表的过程中并没有符合作为索引的字段,可以专门设置一个自增字段用来作为主键(类型int,勾选Auto Increase选项)最后,URL中可能包含session信息,导致安全上的隐患。mysql主键什么时候不自增?
在MySQL中,主键通常是自增的。但是,有一些情况下主键不会自增:
1. 当表中已经存在主键列并且已经定义为主键时,新增的主键值不会自增。
2. 当手动指定主键值时,新插入的记录的主键值不会自增。可以使用INSERT语句的VALUES子句来指定主键的值。
3. 当使用INSERT语句的SELECT子句来从另一个表插入记录时,新插入的记录的主键值不会自增。
4. 当使用REPLACE语句来替换主键已经存在的记录时,新插入的记录的主键值不会自增。
总的来说,主键不是自增的情况是在人为指定主键值的时候。
解析分布式主键MongoDB ObjectId,可以作为Mysql主键吗?
可以的。
全局唯一 ID
有些同学可能会有疑问,MySQL 数据库本身就有自增长的主键,为什么还需要别的组件协助生成呢?
如果是单台 MySQL 数据库的话,当然是用本身的自增长序列就可以了,但是如果我们做了分库分表之后呢?比如用户表 userTable 数据量达到了 4000 万,单表有些吃力,我们将 userTable 拆成两张表保存到两个 MySQL 数据库中;这时候如果再使用数据库本身的自增序列,倒是也不会有错,每一个表内的主键不会重复,但是表和表比较的话,主键 ID 可能会发生重复;这时候就需要使用组件或者算法,生成全局唯一 ID 了。
MongoDB ObjectId
MongoDB 的 ObjectId ,也是可以用于全局唯一 ID 的。
{"_id": ObjectId("5d47ca7528021724ac19f745")}
MongoDB 的 ObjectId 共占 12 个字节,其中:
3.2 之前的版本(包括 3.2):4 字节时间戳 + 3 字节机器标识符(机器 ID) + 2 字节进程 ID + 3字节随机计数器;
3.2 之后版本:4 字节时间戳 + 5 字节随机值 + 3 字节递增计数器;
其中时间戳字节可以保证毫秒级唯一,节机器标识符考虑到了分布式,字节进程 ID 保证了同一台服务器运行多个实例时的唯一性,字节递增计数器保证了同一个时间点内 ID 的唯一性。
优缺点
不管是老版本还是新版本,MongoDB 的 ObjectId 至少都可以保证集群内的唯一,我们可以搭建一个全局唯一 ID 生成的服务,利用 MongoDB 生成 ObjectId 并对外提供服务(MongoDB 的各语言驱动都实现了 ObjectId 的生成算法)。
优点:MongoDB 的性能不错,可以使用集群部署,保证其高可用;ID 内自带一些含义,比如时间戳,必要的时候可以进行反解;
缺点:和数据库一样,需要引入对应的组件/软件,增加了系统的复杂度;最关键的是,这两种方案都意味着生成全局唯一 ID 的系统(服务),会成为一个单点,在软件架构中,单独就意味着风险;如果这个服务出现问题,那么所有依赖于这个服务的系统都会崩溃掉。
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。