1.主键生成策略方式 ? 主键生成策略 2.基于Saas主键表生成主键id流程 由于我们的系统时基于Saas的,因此生成主键时,需要以租户id(TenantId)为基础进行生成。 为了生成的id符合我们的租户的要求,通常都会现将租户表建好,然后基于租户表中的租户id进行主键id的生成。此时便产生基于租户id生成主键,那么怎样生成主键id呢?可以查看下图: ? (* com.xtt..*.dao.mapper..*.insert*(..))") public void primaryKeyRule() {} 也就是说在进行主键的生成时,我们拦截好需要生成的主键 拿到租户id后,就可以进行主键id获取了。 private void setPrimaryKey(Object entity, Class<? return current; } 从而实现主键自增的目的,从而实现基于租户id进行自增的策略。
1,主键的删除 ALTER TABLE TABLENAME DROP PRIMARY_KEY 运行上面的SQL能够删除主键;假设不成功能够用 ALTER TABLE TABLENAME DROP CONSTRAINTS COLUMN CASCADE; –删除约束 ALTER TABLE TABLENAME DISABLE PRIMARY_COLUMN ; –设置被设置为主键的列为无效 DROP INDEX INDEX_NAME; –删除主键索引 2,查看主键约束 SELECT * FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE =’P’ AND TABLE_NAME=’你要查看的表名’ AND OWNER=USER 3,创建联合主键 ALTER TABLE ADD CONSTRAINTS ‘约束名’ PRIMARY
例子代码如下: CREATE TABLE `book_sort2` ( `sort_id2` varchar(20) NOT NULL, `sort_id1` varchar(20) NOT NULL COMMENT ‘一类id’, `sort_name2` varchar(20) NOT NULL COMMENT ‘二类名称’, PRIMARY KEY (sort_id2,sort_id1), KEY unionkeyname primary key (column1,column2); 上面语句中: tablename … mysql创建,添加主键 primary key 1.最简单的 : CREATE TABLE t1( id int not null, name char(20)); 2.带主键的: a:CREATE TABLE t1( id … MySQL创建双主键 如下: CREATE 联合索引 我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升
主键本身是很简单的,但是围绕他产生的故事就不是那么简单了。 1、 管理 这个是最重要的,没有规矩不成方圆,主键要如何管理一定要实现确定好了,甚至有必要为此写一个规范。 比如是全公司采用相同的方式处理主键,还是根据项目、产品来各自管理?还是由项目组成员自行决定?这些都是需要实现说清楚的。 2、 定义 不是说“主键”这个词的定义,而是主键用什么,比如用GUID还是用int,还是年月日时分秒+流水? 3、 生成 主键用什么确定好了之后就是如何生成了。 4、 安全 1,2,3,4这种主键是否够安全?是不是因为不安全就不能用了?一定要改成GUID才行?那么改成GUID了,是否还需要进行安全判断?什么情况下可以用int,什么时候不能用(因为安全原因)? 7、 数据合并 几个分公司的数据需要合并到一起,主键是否会冲突(重复)? 说这些的目的就是想让大家讨论的时候更明确一些,虽然我们都在讨论主键,但是这个范围也是很大的。 欢迎大家继续补充。
自增主键有两个性质需要考虑: 单调性 每次插入一条数据,其 ID 都是比上一条插入的数据的 ID 大,就算上一条数据被删除。 自增主键的单调性 为何会有单调性的问题? 这主要跟自增主键最大值的获取方式,以及存放位置有关系。 如果最大值是通过计算获取的,并且在某些情况下需要重新获取时,会因为最新的数据被删除而减小。 自增主键最大值怎么取的?存放到哪里? 从 MySQL 8.0 开始,自增主键最大值会在每次修改后写入到 redo log,并且在每个检查点写入引擎私有的系统表。 如果是正常重启,则读取系统表里的值。 不保证事务 A 的数据的 ID 连续: innodb_autoinc_lock_mode = 2 (mutex) 三种插入定义: 简单插入 能够提前知道插入的行数 批量插入 不能提前知道插入的行数 混合插入
Hibernate有如下主键: ---- Native: Native主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式。 ---- Increment: Increment方式对主键值采取自动增长的方式生成新的主键值,但要求底层数据库支持Sequence方式,如Oracle、DB2等。 特点是与底层数据库有关,要求数据库支持Identity,如MySQL中是auto_increment,SQL Server 中是Identity,支持的数据库有MySQL、SQL Server、DB2、 特点是需要底层数据库支持序列,支持序列的数据库有DB2、PostgreSql 、Oracle、SAPDb 等在不同数据库之间移植程序,特别是从支持序列的数据库移植到不支持序列的数据库需要修改配置文件。 特点是需要额外的数据库表的支持,能保证同一个数据库中主键的主键的唯一性,但不能保证多个数据库之间主键的唯一性。
表中的任何列都可以作为主键,只要它满足以下条件: 1、任何两行都不具有相同的主键值 2、每个行都必须具有一个主键值(主键列不允许NULL值) 除MySQL强制实施的规则外,应该坚持的几个普遍认为的最好习惯为 : 1、不更新主键列的值 2、不重用主键列的值 3、不在主键列中使用可能会更改的值(例如,如果使用一个名字作为主键以标识某个供应商,应该供应商合并和更改其名字时,必须更改这个主键) 总之:不应该使用一个具有意义的 二.操作 创建表中添加自增主键: create table s1 (id int(11) AUTO_INCREMENT PRIMARY KEY ; 增加主键: ALTER TABLE s2 ADD PRIMARY KEY(id); ALTER TABLE s2 CHANGE id id int(11) NOT NULL AUTO_INCREMENT; 删除主键: ALTER TABLE s2 CHANGE id id int(11); ALTER TABLE s2 DROP PRIMARY KEY; 增加自增长主键前,先增加主键,再自增长 删除主键前,先删除自增长,再删除主键 三.技巧 主键的作用,在于索引无特殊需求下
@Id 注解用于标识实体类中的主键字段,在数据库表中对应的是主键列。 @GeneratedValue注解用于定义主键生成策略,strategy属性指定了生成主键的方式,常用的取值有IDENTITY、SEQUENCE、TABLE等。 @Id注解是JPA规范中的注解,用于标记实体类的主键字段。 在MyBatis中,@TableId注解和@Id注解具有相同的功能,用于标记实体类的主键字段。 @Id注解在实体类的主键字段上进行标注,表示该字段为实体类的主键。 ,并使用了@GeneratedValue(strategy = GenerationType.IDENTITY)和@TableId注解的type属性设置了主键生成策略为数据库自增长主键。
1、hibernate配置联合主键 1.1 联合主键的好处: 联合主键的好处是不需要因为需要主键而增加一个无用的主键列 1.2 联合主键的建表语句 CREATE TABLE `HTTP_TERMINAL_DETAIL_STATISTICS property name="yearName" type="java.lang.String" column="YEAR_NAME"/> </class> </hibernate-mapping> 2、 ></version> 3、mysql数据类型 数字类型 类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 32 767) (0,65 535) 大整数值 MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值 INT或INTEGER 4 字节 (-2 D+2 依赖于M和D的值 依赖于M和D的值 小数值 日期类型 类型 大小(字节) 范围 格式 用途 DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值 TIME
01、前言 前阵子和朋友聊天,他说他们项目有个需求,要实现主键自动生成,不想每次新增的时候,都手动设置主键。于是我就问他,那你们数据库表设置主键自动递增不就得了。 Integer), www.test1.com(String), 1(String), 356829258896637962(Long), 2020-09-11 15:52:04.847(Timestamp), 2( Integer), www.test2.com(String), 2(String) 15:52:04 [main] DEBUG c.n.lybgeek.dao.TestDao.saveBatch - Integer), www.test2.com(String), 2(String), 356831196635725830(Long) 15:59:46 [main] DEBUG c.n.lybgeek.dao.TestDao.saveBatch ,但文中更多讲解如何实现一个拦截器以及主键生成思路,并没把intercept实现主键方法贴出来。
自增主键:特指在自增列上定义的主键。 自增主键的优点是让主键索引保持递增顺序的插入,避免页分裂,索引更加紧凑。 1. 自增值保存在哪? 不同的存储引擎保存自增值的策略不一样; a. 2. 自增值修改策略? a. 在插入时如不指定或指定为0,null,则使用当前的自增值填到自增字段;并设置当前自增值=当前自增值+auto_increment_increment 步长; b. :语句执行过程中,第一次申请自增 id,会分配 1 个;1 个用完以后,这个语句第二次申请自增 id,会分配 2 个;2 个用完以后,还是这个语句,第三次申请自增 id,会分配 4 个;依此类推,同一个语句去申请自增 对于批量插入数据,使用insert … select, replace … select 和load data语句时,可设置innodb_autoinc_lock_mode=2, binlog_format
1.1 xml 配置主键返回 <! selectKey> insert into orders value(null, #{ordertime}, #{total}, #{uid}) </insert> 1.2 注解配置主键返回 insert into orders values(null, #{ordertime}, #{total}, #{uid})") Integer insert(Orders orders); 1.3 获取主键
前言 前阵子和朋友聊天,他说他们项目有个需求,要实现主键自动生成,不想每次新增的时候,都手动设置主键。于是我就问他,那你们数据库表设置主键自动递增不就得了。 Integer), www.test2.com(String), 2(String) 15:52:04 [main] DEBUG c.n.lybgeek.dao.TestDao.saveBatch - Integer), www.test2.com(String), 2(String), 356831196635725830(Long) 15:59:46 [main] DEBUG c.n.lybgeek.dao.TestDao.saveBatch ,但文中更多讲解如何实现一个拦截器以及主键生成思路,并没把intercept实现主键方法贴出来。 其原因主要是主键自动生成在mybatis-plus里面就有实现,其次是有思路后,大家就可以自己实现了。
介绍一下在phpmyadmin下如何设置主键、删除主键。 ALTER TABLE `tmp2` ADD PRIMARY KEY( `id`); 也可以通过phpmyadmin界面进行操作,可以选择数据表,选择“结构”,选取需要设置主键的字段,点击“主键”即可完成设置 设置好主键以后,可以看到主键名称后面有一把黄色的钥匙,鼠标移动上去会有“主键”的提示字样。下面也会显示有一个主键的键名“PRIMARY”。 如果要删除上面的主键约束,可以直接点击上图下方的“删除”,修改主键可以选择“编辑”更改其他字段为主键。 当然也可以用以下命令来删除主键约束: ALTER TABLE `tmp2` DROP PRIMARY KEY; 收藏 | 0点赞 | 0打赏
本章主要内容面向接触过C++ Linux的老铁 主要内容含: 一.主键优化 1.主键设计原则 满足业务需求的情况下, 尽量降低主键的长度。 尽量不要使用UUID做主键或者是其他自然主键,如身份证号 对于一个表。聚集索引有一个,但二级索引有很多,二级索引到叶子节点中挂的就是主键。 主键比较长,二级索引比较多,会占用许多空间,搜索时耗费更多磁盘io 业务操作时,避免对主键的修改。 插入数据时,尽量选择 顺序插入 ,选择使用AUTOINCREMENT自增主 顺序插入可以减少 页分裂 (可以了解下按下面的数据组织方式) 2.数据组织方式 【1】主键顺序插入 在大多数数据库系统中,如表数据是使用 主键顺序插入 第一个页满了,插入第二个页,一页16k,以此类推 【2】页分裂(主键乱序插入) 下面演示页分裂: 此时两页都满了, 我们要插入id为50的数据 ,他会开辟一个新的数据页,但并不是直接插入到第三个数据页当中
主键生成策略介绍 主键的作用就是唯一标识,我们可以通过这个唯一标识来定位到这条数据。当然对于表数据中的主键,我们可以自己设计生成规则,生成主键。 常见的分表策略有两种 【1】水平拆分 水平拆分就是将一个大的表按照数据量进行拆分 【2】垂直拆分 垂直拆分就是将一个大的表按照字段进行拆分 其实我们对于拆分后的数据,有三点需求,就拿水平拆分来说: 【1】之前的表的主键是有序的,拆分后还是有序的 【2】虽然做了表的拆分,但是每条数据还需要保证主键的唯一性 【3】主键最好不要直接暴露数据的数量,这样容易被外界知道关键信息 那就需要有一种算法,能够实现这三个需求 主要分为四部分存储 【1】1位的符号位,固定值为0 【2】41位的时间戳 【3】10位的机器码,包含5位机器id和5位服务id 【4】12位的序列号 使用雪花算法可以实现有序、唯一、且不直接暴露排序的数字 UUID的编码规则: 【1】1~8位采用系统时间,在系统时间上精确到毫秒级保证时间上的唯一性; 【2】9~16位采用底层的IP地址,在服务器集群中的唯一性; 【3】17~24位采用当前对象的HashCode
利用SEQUENCE和触发器 例如:表名:TBOOK 主键名:BOOKID 创建序列 create sequence SEQ_BOOK increment by 1 start with 1 maxvalue 999999999; 创建触发器实现主键自增 create or replace trigger TBOOK_TRIGGER before insert on TBOOK
优点: 1、数据库自动编号,速度快,而且是增量增长,聚集型主键按顺序存放,对于检索非常有利。 2、 数字型,占用空间小,易排序,在程序中传递方便。 2、对数据库有依赖,每种数据库可能实现不一样,数据库切换时候,涉及到代码的修改,不利于扩展 结论: 自增id做主键适用于非分布式架构。 2、信息不安全:基于MAC地址生成UUID的算法可能会造成MAC地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制作者位置。 2、在使用uuid作为主键的时候,最好设计createtime(创建时间)列和modifytime(修改时间)列以应付可能的排序等场景。 结论: 用自建的id生成器做主键适用于大规模分布式架构 参考: 【1】:红心李 :MySQL主键设计 【2】:Uncle Nucky :MySQL数据库主键设计原则 【3】:ellis:设计套路:Mysql
MySQL主键约束是一种用于确保表中每行数据的唯一性的限制。每个表只能有一个主键,它可以是一个或多个列。创建表时添加主键约束在创建表时添加主键约束,需要在列名后面添加关键字"PRIMARY KEY"。 ,"id"列被指定为主键,而"name"和"age"列不是。 在已经存在的表中添加主键约束如果已经存在一个表,但需要将某些列或字段添加主键约束,可以使用ALTER TABLE语句来修改表结构。 例如,以下是向已经存在的表中添加主键约束的示例:ALTER TABLE my_tableADD PRIMARY KEY (id);在上面的示例中,"id"列被指定为主键。 主键约束和自增列通常情况下,主键约束通常与自增列一起使用。自增列是指在插入新行时,自动为该行分配一个唯一的值。在MySQL中,可以使用AUTO_INCREMENT关键字来创建自增列。
Sql代码 mysql> create database ssh2; Query OK, 1 row affected (0.04 sec) mysql> use ssh2; Database lastname varchar(200) not null, -> age integer -> ); Query OK, 0 rows affected (0.46 sec) 给主键增加一个自增的功能 auto_increment ; Query OK, 1 row affected (0.28 sec) Records: 1 Duplicates: 0 Warnings: 0 这样,上面的user表里面的主键