数据库主键

38 是否要使用memory引擎的表

£可爱£侵袭症+ 提交于 2020-03-23 12:47:00
38 是否要使用 memory 引擎的表 内存表的数据组织结构 create table t1(id int primary key, c int) engine=Memory; create table t2(id int primary key, c int) engine=innodb; insert into t1 values(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(0,0); insert into t2 values(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(0,0); 可以看到,内存表 t1 的返回结果里面 0 在最后一行,在 innodb 表 t2 的返回结果, 0 在第一行,二者的差别要从他们的 主键索引 的组织方式说起。 表 t2 是 innodb 表,是主键索引 id 的方式, innodb 表的数据放在主键索引树上,是一个 B+ tree ,如下 主键索引上的值是 有序 存储的,在 select * 的时候,就会按照叶子节点上从左往右扫描,所以结果里 0 在第一行。 与 innodb 不同, memory 引擎的数据和索引是分开的, 可以看到,内存表的数据部分以数组的方式单独存放,而主键 id 索引里,存的是每个数据的位置

浅析Hibernate映射(二)——关系映射(2)

微笑、不失礼 提交于 2020-03-23 11:31:47
单向一对一关联映射 有两种方式实现一对一关联映射: 1、主键关联:让两个实体的主键一样,即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有多余的字段来维护它们之间的关系,仅通过表的主键来关联。 映射后的关系模型: 映射文件: User.hbm.xml <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.jialin.hibernate"> <class name="Person"> <id name="id"> <!--采用foreign策略,可以取得关联对象的主键 --> <generator class="foreign"> <!--property代表要关联的对象 --> <param name="property">card</param> </generator> </id> <property name="name" /> <!-- constrained用来区别是否如何加载其关联对象, 1、默认为false

mysql数据库面试总结

喜你入骨 提交于 2020-03-23 04:59:04
数据库优化 建表优化 1)数据库范式 l 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。 如电话列可进行拆分---家庭电话、公司电话 l 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。 l 第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。 比如 Student 表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话) 这样一个表结构,就存在上述关系。 学号 --> 所在院校 --> ( 院校地址,院校电话 ) 这样的表结构,我们应该拆开来,如下。 (学号,姓名,年龄,性别,所在院校) -- (所在院校,院校地址,院校电话) 满足这些规范的数据库是简洁的、结构明晰的;同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。 2)数据类型选择 l 数字类型 Float 和 double 选择(尽量选择 float ) 区分开TINYINT / INT / BIGINT,能确定不会使用负数的字段,建议添加 unsigned定义 能够用数字类型的字段尽量选择数字类型而不用字符串类型的 l 字符类型 char,varchar,TEXT的选择:非万不得已不要使用 TEXT 数据类型,定长字段,建议使用

数据库3大范式

让人想犯罪 __ 提交于 2020-03-21 18:15:29
第一范式:每个列不可拆分 第二范式:在第一范式上,非主键列完全依赖主键,而不能依赖主键一部分 第三范式:在第二范式上,非主键列只能依赖主键,不依赖其他非主键 设计数据库结构,尽量遵守3范式。考虑性能等问题,可以不严格遵守。 来源: https://www.cnblogs.com/ivy-xu/p/12540145.html

Mybatis在insert时返回主键id

萝らか妹 提交于 2020-03-21 02:58:23
需要注意的地方: 1、添加记录能够返回主键的关键点在于需要在标签中添加以下三个属性。 useGeneratedKeys:必须设置为true,否则无法获取到主键id。 keyProperty:设置为POJO对象的主键id属性名称。 keyColumn:设置为数据库记录的主键id字段名称 2、新添加主键id并不是在执行添加操作时直接返回的,而是在执行添加操作之后将新添加记录的主键id字段设置为POJO对象的主键id属性 调用时: roomCheckInfoMapper.insertSelective(roomCheckInfo); int rciId = roomCheckInfo.getRciId(); System.out.println("插入返回的主键为"+roomCheckInfo.getRciId()); 来源: https://www.cnblogs.com/kkvt/p/12536300.html

Hibernate主键生成策略

折月煮酒 提交于 2020-03-20 23:54:49
Hibernate主键生成策略 increment 用于为 long , short 或者 int 类型生成 唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用, 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。 identity 对 DB2,MySQL,MS SQL Server,Sybase 和 HypersonicSQL 的内置标识字段提供支持。返回的标识符是 long , short 或者 int 类型的, 使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很常用) sequence 在 DB2,PostgreSQL,Oracle,SAP DB,McKoi 中使用序列(sequence), 而在 Interbase 中使用生成器(generator)。返回的标识符是 long , short 或者 int 类型的, 调用数据库的sequence来生成主键,要设定序列名,不然hibernate无法找到: <param name="sequence">NAME_SEQ</param>(Oracle中很常用) hilo

黑马程序员----SQL 语句学习

百般思念 提交于 2020-03-20 07:43:07
---------------------- Windows Phone 7手机开发 、 .Net培训 、期待与您交流! ---------------------- 数据库概念 1.1 catalog(分类),不同类的数据应该放到不同的数据库中 a、偏于对各个Catalog进行个性化管理 b、避免命名冲突 c、安全性更高 1.2 Table(表) 不同类型的资料放到不同的格子中,将这种区域叫做表。不同的表根据方的数据不同进行空间的优化,找起来也方便。 a、主键(PrimaryKey) : 就是数据行的唯一标识。不会重复的列才能当主键。一个表可以没有主键,但是会非常难以处理,因此没有特殊里有表都要设定主键。 主键有两种选用策略: 业务主键和逻辑主键 。业务主键是使用有业务意义的字段做主键,比如身份证号、银行账号等;逻辑主键是使用没有任何业务意义的字段做主键,完全给程序看的,业务人员不会看的数据。因为很难保证业务主键不会重复,不会变化,因此推荐用逻辑主键。 b、表间关联、外键:当表中出现字段重复时,可以把原先比较重复的表,化简为两个表来表示。一个表中的主键是另外一个表的外键。外键就是关联两个表的键. 1.3在数据库中的数据类型与在C#中的区别 bit相当于C#中的bool类型, char(10)10个字符 int 32位 bigint 64位 nvarchar(max)无限长的字符串

JPA之常用 基本注解

荒凉一梦 提交于 2020-03-19 11:22:13
3 月,跳不动了?>>> JPA之常用 基本注解 1、常用基本注解 @Entity @Table @Basic @Column @GeneratedValue @Id 2、特殊注解 @Transient @Temporal 用 table 来生成主键 3、常用注解的使用 1、 @Entity 标注用于实体类声明语句之前,指出该Java 类为实体类,将映射到指定的数据库表。如声明一个实体类 Customer,它将映射到数据库中的 customer 表上。 2、 @Table 当实体类与其映射的数据库表名不同名时需要使用 @Table 标注说明,该标注与 @Entity 标注并列使用,置于实体类声明语句之前,可写于单独语句行,也可与声明语句同行。 @Table 标注的常用选项是 name,用于指明数据库的表名 @Table标注还有一个两个选项 catalog 和 schema 用于设置表所属的数据库目录或模式,通常为数据库名。 uniqueConstraints 选项用于设置约束条件,通常不须设置。如下代码: @Table(name= " JPA_CUSTOMERS " ) // 主要是映射表名对应的数据库表名JPA_CUSTOMER默认情况下可以不写表名与持久化类名相同 @Entity // 表明这是一个持久化类 public class Customer { 3、 @Id @Id

深入理解MySQL索引

做~自己de王妃 提交于 2020-03-18 13:26:59
前言 当提到MySQL数据库的时候,我们的脑海里会想起几个关键字:索引、事务、数据库锁等等,索引是MySQL的灵魂,是平时进行查询时的利器,也是面试中的重中之重。 可能你了解索引的底层是b+树,会加快查询,也会在表中建立索引,但这是远远不够的,这里列举几个索引常见的面试题: 1、索引为什么要用b+树这种数据结构? 2、聚集索引和非聚集索引的区别? 3、索引什么时候会失效,最左匹配原则是什么? 当遇到这些问题的时候,可能会发现自己对索引还是一知半解,今天我们一起学习MySQL的索引。 一、一条查询语句是如何执行的 首先来看在MySQL数据库中,一条查询语句是如何执行的,索引出现在哪个环节,起到了什么作用。 1.1 应用程序发现SQL到服务端 当执行SQL语句时,应用程序会连接到相应的数据库服务器,然后服务器对SQL进行处理。 1.2 查询缓存 接着数据库服务器会先去查询是否有该SQL语句的缓存,key是查询的语句,value是查询的结果。如果你的查询能够直接命中,就会直接从缓存中拿出value来返回客户端。 注:查询不会被解析、不会生成执行计划、不会被执行。 1.3 查询优化处理,生成执行计划 如果没有命中缓存,则开始第三步。 解析SQL:生成解析树,验证关键字如select,where,left join 等)是否正确。 预处理:进一步检查解析树是否合法,如检查数据表和列是否存在

Kettle中通过触发器方式实现数据 增量更新

穿精又带淫゛_ 提交于 2020-03-18 04:21:22
在使用Kettle进行数据同步的时候, 共有 1.使用时间戳进行数据增量更新 2.使用数据库日志进行数据增量更新 3.使用触发器+快照表 进行数据增量更新 今天要介绍的是第3中方法。 实验的思路是这样的,在进行数据同步的时候, 源数据表为A表, A表要对 目标表(target table) B 表和C表进行数据的同步更新。 即A表中的对应字段发生变化之后, 会通过触发器将对应变化的字段在A表中的主键值写入到一个临时表temp中(该表作为快照表使用)。 快照表中只有两个字段,一个是temp_id,是快照表的主键,另一个是 A_id,记录的是在A表中发生变化的字段对应的主键的值。 temp( temp_id int primary key auto_increment , A_id int ); 接下来,通过对快照表temp进行扫描,把在B表和C表中出现的与temp表中与A_id相匹配的字段, 从B,C两个目标表中进行移除。 在接下来,让A表作为源 让B和C作为目标 对B,C做插入/更新操作; 这样就实现了A表对B,C两个表的更新,在后续的操作中可以使用SQL语句将 temp表, 以及触发器进行 drop操作,以免其浪费内存资源。 在创建 trigger的时候,只要针对A表的 删除、 更新操作进行创建trigger 即可。 下面来分析一下,对A表进行的不同操作的情况: 1