-
2020-05-27 18:27:20
简单介绍
首先我们先了解一下什么叫虚拟表虚拟表,顾名思义就是就是实际上并不存在(物理上不存在),但是逻辑上存在的表。
在MYSQL中存在三种虚拟表:临时表、内存表、视图1、基本表
基本表是本身独立存在的表,在SQL中一个关系就对应一个表。2、中间表
中间表它主要是用来兼容数据,建立映射关系,来兼容新老数据表的数据。一般是在实体之间存在多对多的关系时,我们会创建一个中间表实体来给它们两个实体建立起联系,时这个中间表实体与其他两个实体形成一对多的关系,这样可以有效的降低数据的冗余。
比如:我们现在有一个学生表和课程表,这两个实体显然是一种多对多的关系,这时候我们就可以引入一个学生课程表来将他们联系起来,这个表我们可以将学生表和课程表的主键作为它的外键,这要学生表和课程表与学生课程表就是一个一对多的关系,简化了表关系否复杂度。3、临时表
临时表是建立在系统临时文件夹中的表,如果使用得当,完全可以像普通表一样进行各种操作。 临时表的数据和表结构都储存在内存之中,退出时,其所占的空间会自动被释放。
临时表又分为外部临时表和内部临时表。1、外部临时表
通过CREATE TEMPORARY TABLE 创建的临时表,这种临时表称为外部临时表。这种临时表只对当前用户可见,当前会话结束的时候,该临时表会自动关闭。这种临时表的命名与非临时表可以同名(同名后非临时表将对当前会话不可见,直到临时表被删除)创建临时表的两种方式:
CREATE TEMPORARY TABLE tmp_table (name VARCHAR(10) NOT NULL, value INTEGER NOT NULL)
1
CREATE TEMPORARY TABLE tmp_table SELECT * FROM table_name
1
2、内部临时表
内部临时表是一种特殊轻量级的临时表,用来进行性能优化。内部临时表有两种类型:一种是HEAP临时表,这种临时表的所有数据都会存在内存中,对于这种表的操作不需要IO操作。另一种是OnDisk临时表,顾名思义,这种临时表会将数据存储在磁盘上。OnDisk临时表用来处理中间结果比较大的操作。如果HEAP临时表存储的数据大于MAX_HEAP_TABLE_SIZE(详情请参考MySQL手册中系统变量部分),HEAP临时表将会被自动转换成OnDisk临时表。OnDisk临时表在5.7中可以通过INTERNAL_TMP_DISK_STORAGE_ENGINE系统变量选择使用MyISAM引擎或者InnoDB引擎。创建内部临时表
CREATE TEMPORARY TABLE tmp_table (name VARCHAR(10) NOT NULL, value INTEGER NOT NULL) TYPE=HEAP
1
4、派生表
派生表是从SELECT语句返回的虚拟表。派生表类似于临时表,但是在SELECT语句中使用派生表比临时表简单得多,因为它不需要创建临时表的步骤。
当SELECT语句的FROM子句中使用独立子查询时,我们将其称为派生表。
与子查询不同,派生表必须具有别名,以便稍后在查询中引用其名称。 如果派生表没有别名,MySQL将发出错误
示例
orders表和orderdetails表中获得2013年销售收入最高的前5名产品。5、视图
视图是从一个或几个基本表导出的表。视图本身不存在独立存储在数据库中,是一个虚表。即数据库中只存放视图的定义而不存放视图对应的数据,这些数据仍然存放在导出视图的基本表中。视图在概念上基本与表等同。视图在概念上与基本表等同,用户可以在基本表那样使用视图,可以在视图上再定义视图。
如何创建视图create view view_name as
# 这里写SQL语句
————————————————
版权声明:本文为CSDN博主「SunBairn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44863976/article/details/102789392更多相关内容 -
Spring Data JPA实体详解
2020-12-24 09:18:42实体通常与底层数据库中的单个关系表相关联,每个实体的实例表示数据库表格中的某一行。2.Spring Data JPA实体管理器2.1 实体管理器概述实体管理器(EntityManager)用于管理系统中的实体,它是实体与数据库之间的...1. Spring Data JPA实体概述
JPA提供了一种简单高效的方式来管理Java对象(POJO)到关系数据库的映射,此类Java对象称为JPA实体或简称实体。实体通常与底层数据库中的单个关系表相关联,每个实体的实例表示数据库表格中的某一行。
2. Spring Data JPA实体管理器
2.1 实体管理器概述
实体管理器(EntityManager)用于管理系统中的实体,它是实体与数据库之间的桥梁,通过调用实体管理器的相关方法可以把实体持久化到数据库中,同时也可以把数据库中的记录打包成实体对象。
2.2 实体管理器的常用方法
2.2.1 实体的四种状态
在此之前我们要先了解实体的状态及其转换,见下图
JPA实体生命周期有四种状态
新建状态(New):对象在保存进数据库之前为临时状态。此时数据库中没有该对象的信息,该对象的ID属性也为空。如果没有被持久化,程序退出时临时状态的对象信息将丢失。
托管状态(Managed):对象在保存进数据库后或者从数据库中加载后、并且没有脱离Session时为持久化状态。这时候数据库中有对象的信息,改对象的id为数据库中对应记录的主键值。由于还在Session中,持久化状态的对象可以执行任何有关数据库的操作,例如获取集合属性的值等。
游离状态(Datached):是对象曾经处于持久化状态、但是现在已经离开Session了。虽然分离状态的对象有id值,有对应的数据库记录,但是已经无法执行有关数据库的操作。例如,读取延迟加载的集合属性,可能会抛出延迟加载异常。
删除状态(Removed):删除的对象,有id值,尚且和Persistence Context有关联,但是已经准备好从数据库中删除。
状态名
作为java对象存在
在实体管理器中存在
在数据库存在
New
Y
N
N
Managed
Y
Y
Y
Datached
N
N
N
Removed
Y
Y
N
用一段程序来示范
@Transactionalpublic voidsave(){//New 状态
Task t = newTask();
t.setTaskName("task" + newDate().getTime());
t.setCreateTime(newDate());//Managed状态
em.persist(t); //实体类t已经有id t.getId();
t.setTaskName("kkk"); //更新任务名称,这时,如果提交事务,则直接将kkk更新到数据库//Detached状态 事务提交或者调用em.clear都直接将实体任务状态变为Detached
em.clear();
t.setTaskName("kkk"); //更新数据不会更新到数据库//Removed状态
em.remove(t);
}
2.2.2 实体管理器的常用方法
对应于实体的四种状态,实体管理器有四种常用的方法,分别是:persist / merge / clear / remove,结合状态图,可以判断,对于不同状态下的实体,各个方法操作结果会有不同:
对于不同状态下的实体,persist 操作结果如下:
新建状态:实体状态迁移到托管状态
托管状态:实体状态不发生改变,但会执行数据库的insert操作
游离状态:方法的调用将会抛出异常信息
删除状态:实体将重返托管状态
对于不同状态下的实体,merge操作结果如下:
新建状态:系统会执行数据库insert操作,同时返回一个托管状态的实体
托管状态:实体状态不发生改变
游离状态:系统将实体的修改保存到数据库,同时返会一个托管状态的实体
删除状态:方法调用将抛出异常
对于不同状态下的实体,refresh 操作结果如下:
新建状态:系统会执行数据库insert操作,同时返回一个托管状态的实体
托管状态:实体状态不发生改变,但会执行数据库的update操作
游离状态:实体状态将返回托管状态
删除状态:方法调用将抛出异常
对于不同状态下的实体,remove 操作结果如下:
新建状态:方法调用将抛出异常
托管状态:实体状态变成删除状态
分离状态:方法调用将抛出异常
删除状态:不发生任何操作
2.2.3 利用实体管理器管理实体(实现实体的CURD)
public classUserRepositoryImpl {
@PersistenceContextprivateEntityManager entityManager;
@Transactionalpublic voidadd(User user) {
entityManager.persist(user);
}
@TransactionalpublicUser update(User user) {
User userUpdate= entityManager.find(User.class, user.getId());
userUpdate.setAddress(user.getAddress());
userUpdate.setName(user.getName());
userUpdate.setPhone(user.getPhone());returnuserUpdate;
}
@TransactionalpublicUser addOrUpdate(User user) {returnentityManager.merge(user);
}
@Transactionalpublic voiddelete(User user) {
entityManager.remove(user);
}publicUser findOne(Integer id) {return entityManager.find(User.class, id);
}public ListfindAll() {
String queryString= "select u from User u";
Query query=entityManager.createQuery(queryString);returnquery.getResultList();
}
}
3. Spring Data JPA实体基础映射
3.1 表映射
@Entity //表示该类为JPA实体类
@Table(name="t_user") //对应数据库中哪张表
public classUser {
@Column(name="phone_", length=11, nullable=true,columnDefinition="CHAR(10) default '000'") //对应数据库表中哪个列字段及对该字段的自定义
private String phone;
3.2 主键映射
@Id //标明主键
@GeneratedValue //主键生成策略
@Column(name="id_")private Integer id;
更多的主键生成策略,详见3.6 的总体代码
3.3 字段映射和约束条件
@Column(name="phone_", length=11, nullable=true,columnDefinition="CHAR(10) default '000'") //对应数据库中哪个列及对该字段的自定义
private String phone;
3.4 单实体多表格存储
通常一个实体对应于一个表格,即表格中的所有的实体属性都存放于一张表,如果将实体的属性分配到多个表格存放,就涉及到单实体多表格存储
@Entity
@Table(name="t_user",catalog="",schema="")
@SecondaryTables({//指明存放的第二张表
@SecondaryTable(name = "t_address",pkJoinColumns=@PrimaryKeyJoinColumn(name="address_id"))
})public classUser {
@Column(name="name_", length=60, nullable=false,unique=true,insertable=false)privateString name;//分表存储
@Column(table = "t_address", name="street_", length = 100)private String street;
3.5 内嵌实体
在定义实体时可能需要将某几个的属性剥离出放到另外一个实体中,以使程序更有层次感,并且当其他实体也需要这几个属性时,我们也不需要再定义这几个属性,把存放这几个属性的实体重新引用即可,操作方法如下:
@Embeddable //标识该实体可嵌入到其他实体中
public classComment {
@Column(name="title_",length=100)
String title;
@Column(name="content_")
String content;
/*//被剥离出的属性
@Column(name="title_",length=100)
String title;
@Column(name="content_")
String content;*/@Embedded//引入该实体
@AttributeOverrides({ //罗列出所有需要重新命名的属性
@AttributeOverride(name = "title", column = @Column(name = "user_title")),
@AttributeOverride(name= "content", column = @Column(name = "user_content"))
})privateComment comment;
内嵌实体在数据库中不会一点单独的表格存放,而是跟数组实体存放于同一表格中。
3.6 实体类代码
importjava.math.BigDecimal;importjava.util.Date;import javax.persistence.*;importorg.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="t_user",catalog="",schema="")
@SecondaryTables({
@SecondaryTable(name= "t_address",pkJoinColumns=@PrimaryKeyJoinColumn(name="address_id"))
})public classUser {
@Id//标明主键
@GeneratedValue //主键生成策略
@Column(name="id_")privateInteger id;/*@Id
@GeneratedValue(generator="uuidGenerator")
@GenericGenerator(name="uuidGenerator",strategy="uuid")
@Column(name="id_",length=32)
private String id;*/
/*@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id_")
private Integer id;*/
/**
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id_")
private Integer id;*/
/*@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idGenerator")
@SequenceGenerator(name = "idGenerator",sequenceName="mySeq",allocationSize=1)
@Column(name="id_")
private Integer id;*/
/*@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "userGenerator")
@TableGenerator(name = "userGenerator",table="pk_generator",
pkColumnName="gen_name",
valueColumnName="gen_value",
pkColumnValue="user_pk",
initialValue=0,
allocationSize=1)
@Column(name="id_")
private Integer id;*/@Column(name="name_", length=60, nullable=false,unique=true,insertable=false)privateString name;
@Column(name="address_", length=60, nullable=false)privateString address;
@Column(name="phone_", length=11, nullable=true,columnDefinition="CHAR(10) default '000'")privateString phone;
@Column(name="inCome_", precision=12, scale=2)privateBigDecimal inCome;
@Temporal(TemporalType.DATE)privateDate birthday;//Date 日期型,精确到年月日,例如“2008-08-08”//Time 时间型,精确到时分秒,例如“20:00:00”//Timestamp 时间戳,精确到纳秒,例如“2008-08-08 20:00:00.000000001”
@Lob
@Column(name="pic_")
@Basic(fetch=FetchType.LAZY)private byte[] pic;
@Lob
@Column(name="note_")
@Basic(fetch=FetchType.LAZY)privateString note;//分表存储
@Column(table = "t_address", name="street_", length = 100)privateString street;//分表存储
@Column(table = "t_address", name="city_")privateString city;//分表存储
@Column(table = "t_address", name="conutry_",length = 20)privateString conutry;
@Column(name="title_",length=100)
String title;
@Column(name="content_")
String content;/*@Embedded //引入该实体
@AttributeOverrides({ //罗列出所有需要重新命名的属性
@AttributeOverride(name = "title", column = @Column(name = "user_title")),
@AttributeOverride(name = "content", column = @Column(name = "user_content"))
})
private Comment comment;*/
//省略get/set方法
}
4. Spring Data JPA实体高级映射
4.1 一对一实体映射的概念和实现方法
如下例,人员表(person)和地址表(adddress),person表是关系的拥有者,表中的address_id字段关联着address表的主键id。
@Entitypublic classPerson {//略
@OneToOne
@JoinColumn(name="address_id",referencedColumnName="aid")//name:主表的外键字段; referencedColumnName:从表的主键//如果关联的字段有多个,采用如下注解//@JoinColumns(value={@JoinColumn(name="address_id",referencedColumnName="aid"),@JoinColumn(name="address_id2",referencedColumnName="aid2")})
private Address address;
4.2 一对多实体映射的概念和实现方法
部门表(depart)和员工表(employee),一个部门可以有多个员工,一对多关系可以采用如下两种实现方法。
4.2.1 中间表方式
创建中间表(depart_employee),表中存放两个表的主键。通过部门id可查询关联员工的id,三张表存在两个主外键关系。
@Entitypublic classDepart {//略
@OneToMany
@JoinTable(name= "depart_employee", //name:关联表
joinColumns = @JoinColumn(name = "depart_id",referencedColumnName="did"), //joinColumns:关系的拥有者与关联表的关系
inverseJoinColumns = @JoinColumn(name = "employee_id",referencedColumnName="eid"))//inverseJoinColumns:关系的被拥有者与关联表的关系
private List employees;
4.2.2 从表增加外键方式
在员工表(employee2)中添加一个depart_id字段,它作为外键关联部门表(depart2)的主键id。
@Entitypublic classDepart2 {//略
@OneToMany
@JoinColumn(name="depart_id",referencedColumnName="id")private List employee2s;
4.3 多对多实体映射的概念的实现方法
多对多的实现也是通过中间表,方法同一对多的中间表实现方式。
@Entitypublic classTeacher {//略
@ManyToMany
@JoinTable(name= "teacher_student",
joinColumns= @JoinColumn(name = "teacher_id",referencedColumnName="tid"),
inverseJoinColumns= @JoinColumn(name = "student_id",referencedColumnName="sid"))private Liststudents;
@Entitypublic classStudent {//略
@ManyToMany(mappedBy= "students")private List teachers;
4.4 级联策略和懒加载
以@OneToOne为例,当我希望删除人员信息时,也将其地址信息删除,则可使用级联策略;当我想要查询人员信息(主实体)时,并不想同时查询出其地址信息(子实体),可以设置懒加载。
@Entitypublic classPerson {
@OneToOne(cascade={CascadeType.REFRESH,CascadeType.REMOVE},fetch=FetchType.LAZY)//@JoinColumn(name="address_id",referencedColumnName="aid")
private Address address;
5. Spring Data JPA实体继承
5.1 实体继承的概念
继承[extends]想必已不陌生,对于JPA来说,我们不但要考虑如何实现Java端的继承关系,还要考虑如何持久化到数据库中。JPA为此提供了三种策略,如下:
5.2 实体继承策略
继承关系如图,继承策略的注解主要应用于父类Item。
5.2.1 继承策略之单一表策略
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)public class Item {
执行单一表策略会将所有实体的信息存放于一张表中,它的优点是信息存放于一张表,查询效率较高,缺点是大量字段为空,浪费存储空间。
如果类名过长或需要更改鉴别字段的名称,可对鉴别字段及可选值自定义:
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="ITYPE",discriminatorType=discriminatorType.CHAR) //声明鉴别字段的字段名,类型
@DiscriminatorValue("I") //该表在鉴别字段列显示的值
public class Item {
@Entity
@DiscriminatorValue("P")public class Phone extends Item {
@Entity
@DiscriminatorValue("B")public class Book extends Item {
效果如下
5.2.2 继承策略之连接表策略
@Entity
@Inheritance(strategy=InheritanceType.JOINED)public class Item {
连接表策略会生成三张表,通过共享主键彼此关联。
这种策略避免了空字段的浪费,但由于采用表关联查询,当数据量过大时,查询效率较低。
5.2.3 继承策略之每个类策略
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)public classItem {/*@Id
@GeneratedValue(strategy = GenerationType.AUTO)*/@Id
@GeneratedValue(strategy= GenerationType.TABLE, generator = "ItemGenerator")
@TableGenerator(name= "ItemGenerator",table="pk_generator",
pkColumnName="gen_name",
valueColumnName="gen_value",
pkColumnValue="item_pk",
initialValue=0,
allocationSize=1)private Long id;
每个类策略实际上是每个类一个表策略,这种策略要求主键不能使用自增的方式,如上面的代码,采用表中获取的方式。
三张表各自存放自己的完整信息,表之间没有任何的关联关系。虽然他们各自存放各自的数据,但主键是连续的。即三个表共用一套主键生成策略(三个表的主键都从另一个表中获取)。
这种策略查询效率高,同时也不存在大量空字段的浪费。
-
JPA 多对多关联 中间表带有属性 两个外键作为中间表的联合主键时 直接操作中间表查询修改的方法
2018-10-30 15:35:23需求:因为中间表使用两个外键作为联合主键 ,如果需要对中间表的属性进行修改, 1、一般做法 从实体类获取中间表的集合,然后遍历中间表的集合,然后修改。 WorkDateTime.getWorkDateTimeProducts() 2...因为中间表带有属性,采用的多对多映射方式 两个实体类都使用 @OneToMany( mappedBy="workDateTime")
需求:因为中间表使用两个外键作为联合主键 ,如果需要对中间表的属性进行修改,
1、一般做法
从实体类获取中间表的集合,然后遍历中间表的集合,然后修改。
WorkDateTime.getWorkDateTimeProducts()
2、一般做法很麻烦,如果条件还需要判断ProductId,则更麻烦
直接采用中间表仓库的做法
1)、建立联合主键
联合主键
public class WorkDateTimeProductKey implements Serializable{
private static final long serialVersionUID = 3586335994284551414L;
private Product product;
private WorkDateTime workDateTime;
}
2)、中间表的仓库
public interface WorkDateTimeProductRepository extends JpaRepository<WorkDateTimeProduct, Long> {
WorkDateTimeProduct findByWorkDateTime_IdAndProduct_Id(long workDateTimeId ,long productId);
}
3)由于业务上,经常会知道两个实体类的主键,就可以通过此方法:findByWorkDateTime_IdAndProduct_Id ()查询到WorkDateTimeProduct,然后直接修改
WorkDateTime_Id 其中 _的意思是 查询WorkDateTimeProduct 的 WorkDateTime 的 id属性
4)测试代码
@SpringBootTest
@RunWith(SpringRunner.class)
public class WorkDateTimeProductRepositoryTest {
@Autowired
WorkDateTimeProductRepository WorkDateTimeProductRepository;
@Test
public void findByWorkDateTimeIdAndProductIdTest(){
WorkDateTimeProduct workDateTimeProduct =WorkDateTimeProductRepository.findByWorkDateTime_IdAndProduct_Id(12l, 13l);
workDateTimeProduct.getAmount();
System.out.println(workDateTimeProduct.getAmount());
}
}
实体类1
@Entity
//@JsonIgnoreProperties(value={"workDateTimeProducts"})
public class WorkDateTime implements Serializable {
private static final long serialVersionUID = 6788933059497808914L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id ;
@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date dinnerDay;
private byte dinnerTime; // 1noon 中餐,2 evening 晚餐,3 morning
private byte state; //订餐时间段是否有效
@OneToMany( mappedBy="workDateTime")
private List<WorkDateTimeProduct> workDateTimeProducts = new ArrayList<WorkDateTimeProduct>();
private byte printAllow; //1为不可以打 2为可以打,
}
实现类2
@Entity
//@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })
public class Product implements Serializable{
private static final long serialVersionUID = -3700731687896498304L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id ;
private String name;
private String description;
private short amount ;
private short price ;
private String productImg;
@OneToMany(mappedBy="product")
List<WorkDateTimeProduct> workDateTimeProducts =new ArrayList<WorkDateTimeProduct> ();
}
中间表
@Entity
@IdClass(WorkDateTimeProductKey.class)
public class WorkDateTimeProduct implements Serializable{
private static final long serialVersionUID = 1207408560047174539L;
@Id
@ManyToOne()
@JoinColumn(name="product_id")
private Product product;
@Id
@JsonIgnore
@ManyToOne()
@JoinColumn(name="workdatetime_id")
private WorkDateTime workDateTime;
private byte state;
private short amount ;
}
-
浅谈MYSQL中的基本表、中间表、临时表、派生表和视图
2019-10-28 21:36:25简单介绍 首先我们先了解一下什么叫虚拟表虚拟表,顾名思义就是就是实际上并不存在(物理上不存在),但是逻辑上存在的表。...一般是在实体之间存在多对多的关系时,我们会创建一个中间表实体来给它们两个实体建立...简单介绍
首先我们先了解一下什么叫虚拟表虚拟表,顾名思义就是就是实际上并不存在(物理上不存在),但是逻辑上存在的表。
在MYSQL中存在三种虚拟表:临时表、内存表、视图1、基本表
基本表是本身独立存在的表,在SQL中一个关系就对应一个表。
2、中间表
中间表它主要是用来兼容数据,建立映射关系,来兼容新老数据表的数据。一般是在实体之间存在多对多的关系时,我们会创建一个中间表实体来给它们两个实体建立起联系,时这个中间表实体与其他两个实体形成一对多的关系,这样可以有效的降低数据的冗余。
比如:我们现在有一个学生表和课程表,这两个实体显然是一种多对多的关系,这时候我们就可以引入一个学生课程表来将他们联系起来,这个表我们可以将学生表和课程表的主键作为它的外键,这要学生表和课程表与学生课程表就是一个一对多的关系,简化了表关系否复杂度。3、临时表
临时表是建立在系统临时文件夹中的表,如果使用得当,完全可以像普通表一样进行各种操作。 临时表的数据和表结构都储存在内存之中,退出时,其所占的空间会自动被释放。
临时表又分为外部临时表和内部临时表。1、外部临时表
通过CREATE TEMPORARY TABLE 创建的临时表,这种临时表称为外部临时表。这种临时表只对当前用户可见,当前会话结束的时候,该临时表会自动关闭。这种临时表的命名与非临时表可以同名(同名后非临时表将对当前会话不可见,直到临时表被删除)
创建临时表的两种方式:
CREATE TEMPORARY TABLE tmp_table (name VARCHAR(10) NOT NULL, value INTEGER NOT NULL)
CREATE TEMPORARY TABLE tmp_table SELECT * FROM table_name
2、内部临时表
内部临时表是一种特殊轻量级的临时表,用来进行性能优化。内部临时表有两种类型:一种是HEAP临时表,这种临时表的所有数据都会存在内存中,对于这种表的操作不需要IO操作。另一种是OnDisk临时表,顾名思义,这种临时表会将数据存储在磁盘上。OnDisk临时表用来处理中间结果比较大的操作。如果HEAP临时表存储的数据大于MAX_HEAP_TABLE_SIZE(详情请参考MySQL手册中系统变量部分),HEAP临时表将会被自动转换成OnDisk临时表。OnDisk临时表在5.7中可以通过INTERNAL_TMP_DISK_STORAGE_ENGINE系统变量选择使用MyISAM引擎或者InnoDB引擎。
创建内部临时表
CREATE TEMPORARY TABLE tmp_table (name VARCHAR(10) NOT NULL, value INTEGER NOT NULL) TYPE=HEAP
4、派生表
派生表是从SELECT语句返回的虚拟表。派生表类似于临时表,但是在SELECT语句中使用派生表比临时表简单得多,因为它不需要创建临时表的步骤。
当SELECT语句的FROM子句中使用独立子查询时,我们将其称为派生表。
与子查询不同,派生表必须具有别名,以便稍后在查询中引用其名称。 如果派生表没有别名,MySQL将发出错误
示例
orders表和orderdetails表中获得2013年销售收入最高的前5名产品。
5、视图
视图是从一个或几个基本表导出的表。视图本身不存在独立存储在数据库中,是一个虚表。即数据库中只存放视图的定义而不存放视图对应的数据,这些数据仍然存放在导出视图的基本表中。视图在概念上基本与表等同。视图在概念上与基本表等同,用户可以在基本表那样使用视图,可以在视图上再定义视图。
如何创建视图create view view_name as # 这里写SQL语句
-
数据表(中间表)的设计:多对多关系
2021-03-01 17:19:57中间表-多对多关系的转化: 在表的使用中,经常存在多对多的关系,以订单和商品为例,一个订单对应多个商品,一个商品也对应多个订单,此时把E-R图(E-R图也称实体-联系图(Entity ...中间表的主键可以是两个外键作为 -
flask通过flask-sqlalchemy三表查询通过连接中间表
2020-06-30 09:46:24flask通过flask-sqlalchemy三表查询查询中间表 -
JPA中间表(关系表)联合主键配置说明
2021-02-20 17:10:29但该关系表中并没有设置唯一主键字段而是联合主键,那么JPA下创建该关系表实体后运行项目会提示No identifier specified或does not define an IdClass的错误。 下面以用户部门关系进行举例说明,用户和部门是多对多... -
数据库设计中的选择:实体成为属性还是表;二元关系还是多元关系;
2019-10-03 01:35:37第一条不用多说,如果设计出来的模型不能正确反映想要表达的实体和各种约束,这自然是失败的设计。至于第二条,如果不注重表达的情绪,一上来就想去考虑有关效率的细节,这样做很容易陷入迷惑,表达清晰的设计容易.... -
关系数据库设计中,用中间表好还是直接设定主外键关联好?
2019-10-08 08:17:42因为大多数的数据库教程上都是告诉你关系数据库如何去创建1:1、1:N和N:M的数据库关系,但我发现很多开源产品中,并没有直接使用关系数据库的关系查询、关系删除等功能,而是直接在代码中对多个表的查询结果进行... -
数据表设计:中间表——多对多关系E-R图转换**
2018-08-28 20:03:102018年06月04日 16:35:57 阅读数:322更多 个人分类: 数据库设计 设计数据表,遇到一个很常见的情况。 ...中间表包含两个实体表的主键,建立两张表沟通。中间表也可以有普通字段。例如商品数... -
在MySQL中建立多对多关系的映射(建立中间表)
2020-11-11 15:14:27但是在建立多对多关系的映射时,我们要借助一张中间表,并在中间表里添加外键,所以两张表的建表语句就是正常的建表语句,只需要添加每个表本身的字段即可,不需要添加额外属性。 随便举个例子吧,route表(线路)... -
数据表设计:中间表——多对多关系E-R图转换
2018-06-04 16:35:57设计数据表,遇到一个很常见的情况...中间表包含两个实体表的主键,建立两张表沟通。中间表也可以有普通字段。例如商品数量,和每种商品总和。注意:要把他们与实体表中字段含义区分开。参考连接:https://zhidao.b... -
无反复支撑自移带式输送机机尾中间架优化设计
2020-06-10 09:46:55为提高自移机尾中间架架体的可靠性与适用性,基于工程实际与虚拟样机技术,建立了自移机尾中间架实体模型;根据自移机尾工作过程,选定最恶劣工况下中间架体受力作为静力学仿真分析载荷;通过仿真分析发现了中间架体... -
实体-联系模型
2022-01-30 09:32:06实体-联系数据模型(E - R数据模型)被开发来方便数据库的设计,它是通过允许定义代表数据库全局逻辑结构的企业模式( enterprise schema )来做到的。 E - R 模型在将现实企业的含义和交互映射到概念模式上非常有用... -
hibernate -- 注解映射实体和表
2018-09-14 18:29:46表名的映射 //代表此类参与ORM映射,此注解必须要有 @Entity //代表user这个类映射了一个表user50,如果表名和类名一样,此注解可以省略 ... //数据库表中主键列名为id,如果实体类属性名和列名相... -
讲明白Spring Data JPA实体关联注解
2020-03-21 10:21:52订单和订单中的商品也是一对多关系,但订单被删除时,订单所关联的商品肯定不能被删除。此时只要配置正确的级联关系,就能达到想要的效果。级联关系类型: CascadeType.REFRESH:级联刷新,当多个用户同时作操作一个... -
无反复支撑自移带式输送机机尾中间架结构优化设计-论文
2021-07-07 20:26:44为提高自移机尾中间架架体的可靠性与适用性,基于工程实际与虚拟样机技术,建立了自移机尾中间架实体模型;根据自移机尾工作过程,选定最恶劣工况下中间架体受力作为静力学仿真分析载荷;通过仿真分析发现了中间架体... -
NHibernate中实体类、Mapping配置文件与数据库表之间的关系
2017-06-16 17:03:28NHibernate是一个O/RM框架在其应用中会产生三部分内容:实体类、Mapping配置文件、数据库表。这三者的联结促成了NHibernate的实现的...实体类和数据库表是相互独立的二者不知道对方的存在,中间任何的交互都是通过Map -
Hibernate框架多对多时中间表没有主键ID解决办法
2018-11-05 16:07:15Hibernate框架多对多时中间表没有主键ID时可以使用组合id,就是哪两列或者多列组合成为一个唯一标识一条记录的id值,在实体类映射文件中配置文件,例如学生表,成绩表,课程表三者之间的关系,其中学号与课程号可以组合... -
数据库中,实体是指( )。
2021-03-15 16:56:02【单选题】Access的SQL语句不能实现是( )。 【单选题】下面过程运行之后,变量J的值为( )。 Private Sub Fun() Dim J As Integer J=2 DO J=J*3 Loop While J【单选题】如果希望根据某个可以临时变化的值来查找记录,... -
数据库笔记——实体关系与数据库中存储的方式
2020-09-17 22:53:30实体间的关系: 一对一:如老公和老婆; 一对多:如一个员工从属一个部门,一个部门拥有多名员工; 多对多:一名老师有多名学生,一名学生有多名老师; 概念模型: Java中的实体类(JavaBean) 描述实体的三种... -
jpa实体类常见注解
2020-06-02 10:47:22@Entity:标识实体类是JPA实体,告诉JPA在程序运行时生成实体类对应表 @Table:设置实体类在数据库所对应的表名 @Id:标识类里所在变量为主键 @GeneratedValue:设置主键生成策略,此方式依赖于具体的数据库 @Basic... -
NLP之中文命名实体识别
2018-09-25 18:45:47在MUC-6中首次使用了命名实体(named entity)这一术语,由于当时关注的焦点是信息抽取(information extraction)问题,即从报章等非结构化文本中抽取关于公司活动和国防相关活动的结构化信息,而人名、地名、组织... -
BiLSTM+CRF(二)命名实体识别
2018-12-03 21:15:11前言 前一篇博客里面,我们已经提到了如何构建一个双向的LSTM网络,并在原来单层的RNN的基础上,修改少数几行代码即可实现。...这篇博客,我们就来看看如何通过BiLSTM+CRF来进行命名实体识别的任务... -
实体-关系联合抽取:Table Filling Multi-Task Recurrent Neural Network for Joint Entity and Relation ...
2019-11-27 20:05:26文章标题:Table Filling Multi-Task Recurrent Neural Network for Joint Entity and Relation Extraction(表填充多任务递归神经网络用于联合实体和关系提取)COLING2016 Abstract 摘要提出了一种基于... -
实体关系图 (ERD) 指南
2021-12-23 16:08:00在本指南中了解有关实体关系图 (ERD)、它们的用途、如何理解它们、如何创建它们等的所有信息。 实体关系图 (ERD) 是一种图表,可让您查看不同实体(例如人员、客户或其他对象)在应用程序或数据库中如何相互关联。 ... -
数据库实体、关系(一对一实现方式、一对多实现方式、多对多实现方式)
2019-09-19 21:36:18就数据库而言,实体往往指某类事物的集合。 把每一类数据对象的个体称为实体。 数据库中:E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型... -
命名实体识别(NER)综述
2021-07-12 21:42:32命名实体识别是自然语言处理中的热点研究方向之一, 目的是识别文本中的命名实体并将其归纳到相应的实体类型中。首先阐述了命名实体识别任务的定义、目标和意义; 然后介绍了命名实体识别研究的发展进程,从最初的... -
实体鉴别GB/T 15843研究(合集)
2018-10-31 22:07:50摘要:本文档对GB/T 15843介绍的实体鉴别进行简要分析记录。GB/T 15843包括GB/T 15843.1-2008 第1部份:概述;GB/T 15843.2-2008 第2部分:采用对称加密算法的机制;GB/T 15843.3-2008 第3部分:采用数字签名技术的... -
MySQL学习笔记(3)-列属性与实体关系
2018-06-03 00:27:00典型的,利用一个中间表表示实体之间的对应关系。 中间表的每个记录,表示一个关系。 可以分析: 一个M:N 1:M 1:N来实现 外键foreign key drop table if exists itcast_class; create table itcast_class( class_...