数据库主键

【SSH】SSH之Hibernate框架:Hibernate的主键生成策略

梦想与她 提交于 2020-02-09 03:15:39
主键: 自然主键 :用表中一个有实际意义的字段(对应持久化类中的一个有实际意义的属性)来作为主键,例如创建的一个人员表,用人员的身份证号作为主键。 代理主键 :不是表中一个有实际意义的字段,它的存在仅仅是用来作为每条记录的唯一标识。在设置主键的时候通常用代理主键,因为自然逐渐是一个有实际意义的字段,有可能会更改,而代理主键没有实际意义,不存在后续更改的情况。 Hibernate的代理主键生成策略: 在实际开发中一般不允许用户设置主键,而是由程序自动生成,Hibernate提供的的主要的主键生成策略有以下几种: increment :适用short、int、long类型的主键,实现原理是首先发送一个sql语句查询表中最大的id,然后将该id+1作为新纪录的id。从原理可以看到该方法存在线程安全问题,因为如果是多个线程同时操作时,新的记录还没插入表中,新的线程就查询到了还没增加的id,此时该线程也会生成一个与上一个线程相同的id,就会发生id冲突。因此,该方法应在单线程中使用。 identity :适用short、int、long类型的主键,使用的是数据库底层的自动增长机制,因此不会出现线程安全问题。但是应该注意的是,DB2,MySQL,MS SQL Server,Sybase 和 HypersonicSQL 等数据库有自动增长机制,而Oracle没有。 sequence

Hibernate 主键生成策略——Duplicate entry '1024' for key 'PRIMARY'

北战南征 提交于 2020-02-08 17:28:13
日常搬砖踩坑系列——Hibernate主键生成策略,主键冲突 项目开发完毕,前后端接口联调;前端童鞋反应新增接口偶尔会报错,经过查看后端服务日志: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '1024' for key 'PRIMARY' ,明显是写入数据主键冲突,一个新增接口并且数据表的主键是自增的,怎么会主键冲突呢? 还原场景 接口联调,基本是在dev环境,有些时候为了方便开发人员也会本地启动服务连接同一个数据库;前端在切换api地址测试接口时会报错。 分析原因 因为主键是自增的,并且新增接口没有指定id(依靠数据库自增),居然会出现主键冲突错误,难道新增时id被指定了而且是开发人员不知情,貌似找到了原因,因为项目中实体类指定了主键生成策略;代码如下: @Entity @Table(name = "user") public class User { @Id @GenericGenerator(name = "autoId", strategy = "increment") @GeneratedValue(generator = "autoId") private Integer id; private String name; } 验证:将项目SQL进行日志输出(jpa.show

day35-存储引擎及创建表的约束

妖精的绣舞 提交于 2020-02-08 11:09:06
一 什么是存储引擎 mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等 数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。 存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方 法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和 操作此表的类型) 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql 数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据 自己的需要编写自己的存储引擎 SQL 解析器、SQL 优化器、缓冲池、存储引擎等组件在每个数据库中都存在,但不是每 个数据库都有这么多存储引擎。MySQL 的插件式存储引擎可以让存储引擎层的开发人员设 计他们希望的存储层,例如,有的应用需要满足事务的要求,有的应用则不需要对事务有这 么强的要求 ;有的希望数据能持久存储,有的只希望放在内存中,临时并快速地提供对数据 的查询。 二 mysql支持的存储引擎 MariaDB [(none)]> show

市政道桥表结构设计

前提是你 提交于 2020-02-08 02:46:31
智慧道桥监管平台数据库设计说明书 引言 编写目的 为了完成系统的数据结构设计,为下一步的开发做好准备,编写本文档。由于本系统目前是产品的第一个版本,而与竞争产品相比,系统在灵活配置、业务覆盖范围等方面会做比较大的改进。 本文档预期的读者是产品设计、开发人员和测试人员。 背景 产品名称:智慧道桥监管平台 任务提出者:北京数字政通科技股份有限公司 任务开发者:数据服务产品部 第一用户:城管局、市政处 术语定义 设计规范 数据库表规范 (1)表名格式:模块名_表含义名,如 认证中心人员表:auth_human;如果系统功能简单,没有划分为模块,则可以以系统英文名称的缩写作为前缀,否则以各模块的英文名称缩写作为前缀 (2)不再使用tc_,to_,tr_前缀 (3)表的名称必须易于理解,使用能表达功能的英文单词或缩写英文单词,词间以_分割 (4)在命名表时,用单数形式表示名称。例如,使用auth_human,而不是auth_humans (5)表名用小写 (6)表名称长度不能超过30个字符(几种数据库中Oracle要求最高) (7)职责相近的表,命名规则应该相同 数据库字段规范 (1)业务表须要有主键,例如自增主键 (2)字段名称必须易于理解,使用能表达功能的英文单词或缩写英文单词,词间以_分割 (3)字段名用小写,且需要加入中文注释 (4)字段名称长度不能超过30个字符

mysql数据库-索引-长期维护

╄→尐↘猪︶ㄣ 提交于 2020-02-08 02:32:35
############### 索引介绍 ############## """ 1. 索引介绍 需求: 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的, 也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。 说起加速查询,就不得不提到索引了。 索引: 简单的说,相当于图书的目录,可以帮助用户快速的找到需要的内容. 在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。能够大大提高查询效率。 特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 本质: 索引本质:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果, 同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。 """ ############### 索引方法 ############## """ 2.索引方法 1. B+TREE 索引 B+树是一种经典的数据结构,由平衡树和二叉查找树结合产生,它是为磁盘或其它直接存取辅助设备而设计的一种平衡查找树, 在B+树中,所有的记录节点都是按键值大小顺序存放在同一层的叶节点中,叶节点间用指针相连,构成双向循环链表, 非叶节点(根节点、枝节点)只存放键值,不存放实际数据。 注意:通常其高度都在2

数据库范式

白昼怎懂夜的黑 提交于 2020-02-08 01:14:31
第一范式   定义表:属性分割 第二范式   分表:各自依赖自己主键 第三范式   关联:主键关联 数据库中的范式有第一范式(1NF),第二范式(2NF),第三范式(3NF),巴斯-科德范式(BCNF),第四范式(4NF),第五范式(5NF)(又称完美范式) 第一范式----数据库中的表(所有字段值)都是不可分割的原子数据项。 第二范式----数据库表中的每一列都和主键相关,而不能只和主键的某一部分相关。也就是说 一个表中只能只能包含一个,不能把多种数据保存在同一个表中。 第三范式----数据库表中每一列数据都和主键直接相关,不能间接相关。 降低数据的冗余度。。。。。。 转自---- Ruthless 数据库设计三大范式 为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。 在实际开发中最为常见的设计范式有三个: 1 .第一范式(确保每列保持原子性) 第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。 第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市

数据库范式

孤者浪人 提交于 2020-02-08 00:49:42
参考 详解数据库的第一范式、第二范式、第三范式、BCNF范式 数据库规范化/范式所解决的问题 数据冗余(信息重复,会造成储存空间的浪费及一些其他问题) 插入异常(如果有限制,导致插入数据时,必须没必要的列也要有值,这种列甚至此时就是没有数据) 删除异常(在某些情况下,当删除一行时,可能会丢失有用的信息,因为这些相对独立的信息没有单独存储到一个表中) 更新异常(冗余信息不仅浪费空间,还会增加更新的难度,想要修改一个信息,结果由于数据冗余,导致需要更新多条记录) 基本概念 首先说明 键字=码字,所以 主键=主码,候选键=候选码...此外也有叫做主关键字,候选关键字的也是一个意思。 主键/码/候选键/候选码 小技巧:假如A是码,那么所有包含了A的属性组,如(A,B)、(A,C)、(A,B,C)等等,都不是码了(因为作为码的要求里有一个“完全函数依赖”) 主属性 非主属性:包含在任何一个码中的属性成为主属性。除了主属性以外的就是非主属性。 超键 能够唯一标识一条记录的属性或属性集。 全码 All-key关系模型的所有属性组组成该 关系模式的 候选码,称为全码。即所有属性当作一个码。若关系中只有一个候选码,且这个候选码中包含全部属性,则该候选码为全码。 函数依赖 部分依赖 传递依赖 范式 最常用的是第一、第二、第三范式。BCNF范式有时要考虑? 第一范式

理解聚簇索引

陌路散爱 提交于 2020-02-07 15:09:18
聚簇索引(Cluster Index)也叫索引组织表(Index-organized Table),MySQL用户经常称呼为前者。 聚簇索引并不是数据库索引的某个种类,其描述的是数据的一种存储方式 。我们知道,在InnoDB中,数据是以B+Tree的形式存储的,其特点就是数据都存储在叶子节点上,非叶子节点上只存索引信息,即key值和指向子节点的指针。这种索引和数据的存储方式就叫做聚簇索引,“聚簇”的意思就是通常来说,数据行和相邻的健挨着。 InnoDB通过主键来聚集数据,也就是说聚簇索引的B+Tree上的叶子结点所存储的key总是主键,如果没有定义主键,InnoDB会选择一个唯一的非空索引代替,如果没有这样的索引,InnoDB会隐式地定义一个主键来聚集(存储)数据,这个隐式的主键被称为rowID。 在InnoDB中,存储聚簇索引的B+Tree的叶子节点是一个数据页,默认大小为16K,这些数据页上的数据其实是一个有序链表,会按照主键递增的顺序来进行存储。在上图中,如果要访问ID为10的记录,InnoDB根据索引找到了key为11的索引,访问其左子节点,然后进行遍历(由于在一个数据页中的数据的存放位置是连续的,所以不会有多次寻址的额外开销),比较key值直到找到ID为10的记录。 对于非聚簇索引,InnoDB通常在叶子节点上存储的是数据行的主键值,命中非聚簇索引时

索引那些事儿----基于Mysql

做~自己de王妃 提交于 2020-02-07 03:38:59
目录 背景 索引 存储引擎 存储引擎种类 MyISAM引擎 InnoDB引擎 索引方式 索引类型 单列索引之普通索引 单列索引之唯一索引 单列索引之主键索引 组合索引 全文索引 空间索引 总结 武汉加油!!! 背景 数据库是什么? 这个问题大家都知道吧, 用来存放数据的, 生活中你在银行中存的金额, 或者一个户籍所中存放的户籍以及个人信息, 在比如一个学校的学生信息等等, 这些都存放在我们的数据库里面. 对不数据库中的数据一般采用一些 DML语句 (insert, update, delete)来进行数据操作. 想要查看数据库里面的数据使用select语句进行数据的查询. 对于数据在数据库里面的存放, 可以简单理解为类似 Excel表格 , 表格里面每一行代表一条数据. 一个 Sheet页 来代表一类数据. 一个例子 现在我们有一张excel表格, 里面存放了一个学校的学生信息, 包含学号, 姓名, 班级,年级等等信息 如果, 如果这张表里面只存放了较少的数据( 几十条, 或者十几条 ), 那现在让你 找到关于张三学生的信息 , 我们便开始从上到下或者从下到上开始浏览每一行数据, 直到找到 张三 , 便完成了数据的查询. 但是, 数据量大了, 这个excel存放了成千上万条数据, 再让你找出来张三, 你还是需要从上到下, 或者从下到上开始找 张三 , 这一次因为数据变多了,

MySql索引

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-06 22:10:01
MySql索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度 索引也会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件 建立索引会占用磁盘空间的索引文件 所以,索引不是越多也好,我们的目的就是把索引建得恰到好处 Mysql索引相关知识 存储引擎 MySQL数据库提供了多种存储引擎,用户可以根据不同的需求为数据表选择不同的存储引擎 同一个数据库也可以使用多种存储引擎的表 在实际开发中使用最多的两种引擎是MyISAM和InnoDB(几乎都是InnoDB) MyISAM MyISAM高速引擎,拥有较高的插入,查询速度 MyISAM存储不支持事务、行级锁和外键约束的功能 MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点 MyISAM的并发插入特性允许同时选择和插入数据 MyISAM表是独立于操作系统的 每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件:表定义文件(.frm),数据文件(.MYD),索引文件(.MYI) InnoDB InnoDB:5.5版本后MySQL的默认数据库,支持事务和行级锁定,比MyISAM处理速度稍慢 InnoDB的表需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引