精华内容
下载资源
问答
  • 工作中遇到这样一个场景,需要使用复合主键

    模拟一个场景,类似工作中遇到的情况。

    模拟场景:

    有一批学生,每个人的学号都是不一样的,且每个学生需要三个账号,银行账号用来收学费,支付宝用来收学习资料费,微信账户用来收活动经费。所以一个人会有三个账户,现在设计一张表,有字段:学号、账号、账户类型三个字段。其中,学号和类型做复合主键。

    这样设计表具有一定的可扩展性,例如将来新增某种账户类型,可以继续添加。

    这样设计也需要保证一个原则,即同一学生同一类型只有一个账户,如果是多个账户就不能这样设计表了。

    表结构

    CREATE TABLE `student_account` (
      `student_id` varchar(20) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '学号',
      `account_no` varchar(30) DEFAULT NULL COMMENT '账号',
      `type` varchar(20) COLLATE utf8mb4_bin NOT NULL COMMENT '账户类型:0-银行 1-微信 2-支付宝',
      PRIMARY KEY (`student_id`,`type`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC;
    

    JOPO

    主键的实体类

    @Embeddable
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class StudentAccountPK implements Serializable {
    
        private static final long serialVersionUID = -7523633817377892758L;
    
        @Column(name = "student_id")
        private String studentId;
    
        @Column(name = "type")
        private String type;
    }
    
    

    表映射的持久类

    @Entity
    @Table(name = "student_account")
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class StudentAccount {
    
        @EmbeddedId
        private StudentAccountPK id;
    
        @Column(name = "account")
        private String account;
    }
    

    持久类里面,要有一个注解@EmbeddedId修饰主键的成员变量,其他的和普通的Entity类一样。它所对应复合主键类需要使用@Embeddable注解

    Repository

    于是我遇到了一个问题,现在有一个需求,需要查询学号为某某的学生的所有账户,也就是说,复合主键当中的某一个字段作为筛选条件,那要怎么写呢?酱紫啦~~

    
    @Repository
    public interface StudentAccountRepository extends JpaRepository<StudentAccount, StudentAccountPK> {
    	// 只查找一个条件
        List<StudentAccount> findByIdStudentId(String studentId);
    	
    	// 查找两个条件(如果有三个复合主键可以这样使用,如果只有两个复合主键就直接findById就行了)
    	List<StudentAccount> findByIdStudentIdAndIdType(String studentId,String type);
    }
    
    展开全文
  • 联合主键和复合主键

    2020-04-03 16:35:25
    联合主键和复合主键联合主键复合主键 联合主键 联合主键其实就是中间表。在多对多模型里,需要两个表中的主键组成联合主键,这样就可以查到两个表中的每个数据。 # 创建Team表 CREATE table Team ( Id MEDIUMINT ...

    联合主键和复合主键

    联合主键

    联合主键其实就是中间表。在多对多模型里,需要两个表中的主键组成联合主键,这样就可以查到两个表中的每个数据。

    # 创建Team表
    CREATE table Team (
    	Id MEDIUMINT AUTO_INCREMENT COMMENT 'team 主键',
    	NAME VARCHAR(10) COMMENT 'team name',
    	PRIMARY KEY(Id)
    )
    ENGINE = INNODB,
    CHARSET = UTF8;
    # 创建Info表
    CREATE table info (
    	Id MEDIUMINT AUTO_INCREMENT COMMENT 'info 主键',
    	Name VARCHAR(30) COMMENT '姓名',
    	PRIMARY KEY(Id)
    )
    ENGINE = INNODB,
    CHARSET = UTF8;
    
    # 联合主键 可以通过这张表查询team和info两个表的主键id 并查询两表的数据。
    CREATE TABLE IF NOT EXISTS Team_info (
    	id MEDIUMINT AUTO_INCREMENT COMMENT 'team_info 主键--联合主键',
    	info_id MEDIUMINT COMMENT 'info 主键',
    	team_id MEDIUMINT COMMENT 'team 主键',
    	PRIMARY KEY (id)
    )
    ENGINE=INNODB,
    CHARSET=UTF8;
    

    复合主键

    复合主键相对好理解:假设 1班 有个叫张三的人,二班也有叫张三的人;如果此时通过name当主键 肯定会报错,如果用班级+姓名做复合主键,也就没有问题。(此案例不严谨,仅作思路)

    CREATE TABLE Stu(
    	Class Varchar(20) COMMENT '班级',
    	NAME VARCHAR(10) COMMENT '姓名',
    	PRIMARY KEY(Class,NAME)
    )
    
    展开全文
  • 什么是数据表的复合主键 所谓的复合主键 就是指你表的主键含有一个以上的字段组成 比如 create table test ( name varchar(19), id number, value varchar(10), primary key (name,id) ) 上面的name和id字段组合...

     

    什么是数据表的复合主键 
    所谓的复合主键 就是指你表的主键含有一个以上的字段组成 
    比如 
    create table test 

       name varchar(19), 
       id number, 
       value varchar(10), 
       primary key (name,id) 


    上面的name和id字段组合起来就是你test表的复合主键 
    它的出现是因为你的name字段可能会出现重名,所以要加上ID字段这样就可以保证你记录的唯一性 
    一般情况下,主键的字段长度和字段数目要越少越好 

    联合主键 
    什么是联合主键? 
    (主键原则上是唯一的,别被唯一值所困扰。) 
    顾名思义就是多个主键联合形成一个主键组合 
    一个简单的例子 
    主键A跟主键B组成联合主键 
    主键A跟主键B的数据可以完全相同(困扰吧,没关系),联合就在于主键A跟主键B形成的联合主键是唯一的。 
    下例主键A数据是1,主键B数据也是1,联合主键其实是11,这个11是唯一值,绝对不充许再出现11这个唯一值。(这就是多对多关系) 
    主键A数据 主键B数据 
    1      1 
    2      2 
    3      3 
    主键A与主键B的联合主键值最多也就是 
    11 
    12 
    13 
    21 
    22 
    23 
    31 
    32 
    33

     

    CREATE TABLE `products_description` (
     

    `products_id` int(11) NOT NULL,
      `language_id` int(11) NOT NULL default '1',
      `products_name` varchar(64) NOT NULL default '',
      `products_description` text,
      `products_short_description` text,
      `products_url` varchar(255) default NULL,
      `products_viewed` int(5) default '0',
      PRIMARY KEY  (`products_id`,`language_id`),
      KEY `products_name` (`products_name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    展开全文
  • 复合主键联合主键、索引与联合(复合)索引

    万次阅读 多人点赞 2018-09-24 22:11:31
    回来顺便看了一下复合主键联合主键,查漏补缺,慢慢学习吧。 一、复合主键联合主键 1、复合主键:指表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键。 create table test (  name ...

    前几天面试时被问到了MySql中联合索引使用与生效问题;回来顺便看了一下复合主键与联合主键,查漏补缺,慢慢学习吧。

    一、复合主键与联合主键

    1、复合主键:指表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键。

    create table test

    (

       name varchar(19),

       id number,

       value varchar(10),

       primary key (name,id)

    )

    上面的name和id字段组合起来就是test表的复合主键 ,它的出现是因为name字段可能会出现重名,所以要加上id字段,这样就可以保证记录的唯一性 ,一般情况下,主键的字段长度和字段数目越少越好 。 

    “当表中只有一个主键时,它是唯一的索引;当表中有多个主键时,称为复合主键,复合主键联合保证唯一索引” 。

    某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样,就不算重复。

    2、联合主键顾名思义就是多个主键联合形成一个主键组合。 

    联合主键的意义:用2个字段(或者多个字段)来确定一条记录。说明:这2个字段可以都不唯一,即2个字段可以分别重复,这么设置的好处,可以很直观的看到某个重复字段的记录条数。 

    举例: 主键A跟主键B组成联合主键 

    主键A跟主键B的数据可以完全相同,联合就在于主键A跟主键B形成的联合主键是唯一的。 

    下例主键A数据是1,主键B数据也是1,联合主键其实是11,11是唯一值,不允许再出现11这个值(即为多对多关系)

    主键A数据   主键B数据 

       1      1 

       2      2 

       3      3 

    主键A与主键B的联合主键值最多为: 11、 12、 13、 21、 22、 23、 31、 32、 33。

    二、索引、联合(组合)索引

    1.索引是加快查询速度的有效手段。系统在存取数据时会自动选择合适的索引作为存取路径。

    创建索引:create [unique] [cluster] index <索引名>

    删除索引:drop index <索引名>

    索引是各种关系数据库系统最常见的一种逻辑单元,是关系数据库系统举足轻重的重要组成部分,对于提高检索数据速度有着至关重要的作用,索引的原理是根据索引值得到行指针,然后快速定位到数据库记录。

    索引的使用

    1). 主键(默认是自带索引的)和外键(以及一些可以跟其他表关联的字段) 

    2). where子句中经常出现的字段 

    3). 索引应该建在小字段上,大数据字段(bit,image,text,blob等)不适用

    2.联合(复合)索引------ 最左匹配原则

    创建联合索引:create index <索引名称> on 表名 (字段1,字段2...);

    例如:有联合索引(a,b,c,d)

    select * from test where a=1 and b=2;----a和b索引都起作用

    索引生效原则:按照联合索引的顺序,从前往后依次使用生效,如果中间某个索引没有使用,那么断点前面的索引部分起作用,断点后面的索引没有起作用

    例如:where a=1 and b=2 and d=4;则只有a和b索引起作用,中间c断了,则d索引不起作用。

    mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。

    比如where a = 1 and b = 2 and c > 3 and d = 4 ,如果建立(a,b,c,d)顺序的索引,d是用不到索引的,因为c出现了“>”。

    如果建立(a,b,d,c)的索引则where a = 1 and b = 2 and c > 3 and d = 4 中abcd都可以用到索引,并且a,b,d的顺序可以任意调整,即:select * from test where b=2 and d=4 and a=1and c>3中a,b,c,d也都用到了索引。

    注意:

    1)只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。

    2)一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。

    3)NOT IN和操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替。

    补充:

    可以在Navicat中建立一张表,并建立一个联合(复合)索引,在表中插入一些数据,之后利用Explain SELECT * FROM 表名 where 索引字段名1= value1 and 索引字段名2=value2 and 索引字段名3>value3;类似的语句来进行分析和查询联合索引。

    详情可查看 https://blog.csdn.net/y1193329479/article/details/78821139

     

    展开全文
  • 联合主键 复合主键

    2017-02-14 10:40:00
    当表中有多个主键时,称为复合主键复合主键联合保证唯一索引”。 为什么自增长ID已经可以作为唯一标识的主键,为啥还需要复合主键呢。因为,并不是所有的表都要有ID这个字段啊哈哈,比如,我们建一个学生表,...
  • 主要介绍了初探SQL语句复合主键联合主键的相关内容,具有一定参考价值,这里给大家分享下,需要的朋友可以参考。
  • 复合主键联合主键

    万次阅读 多人点赞 2017-05-02 17:05:57
    一、复合主键  所谓的复合主键 就是指你表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键。 比如  create table test ( name varchar(19), id number, value varchar(10), primary ...
  • [code="java"] [/code] 通常在使用联合主键,也意味着这些列也...
  • 复合主键联合主键

    2021-07-12 11:24:05
    复合主键:在一个表中,设定多个字段共同作为主键。比如表中字段有:姓名 性别 年龄,把姓名+性别共同作为主键,姓名+性别的组合不能重复。 联合主键:多用于关联表中,两个表中的主键组成联合主键。比如user表主键...
  • 数据库的表中有多个主键,我们和数据库交互的实体(Entity)中只定义了其中部分主键,也就是数据库表中的字段多于Entity中定义的字段。当我们查询时发现,查询返回的结果和我们预想的完全不一致。
  • mysql的联合主键与复合主键区别

    千次阅读 2018-10-30 15:53:50
    复合主键就是指你表的主键含有一个以上的字段组成 。 例如; create table test ( name varchar(19), id number, value varchar(10), primary key (id,name) ) 上面的id和name字段组合起来就是你test表的复合主键 ...
  • Hibernate复合主键

    2018-06-03 21:05:34
    一个简单的复合主键的做关联类的例子
  • 复合主键

    2016-09-11 19:04:16
    一、复合主键映射  复合主键映射需要在映射配置文件中使用标签,该标签是指将一个类指定为相应的复合主键,它的name属性需要指定类文件中定义的属性值,并在该标签中添加子标签。  Note:想要使用复合映射...
  • oracle主键和复合主键联合主键)

    千次阅读 2019-09-02 17:57:03
    1.主键和复合主键查询性能相同(索引高度相同,恰当的运用索引) 2.主键和复合组件,(update,insert)性能不同(因为复合主键会用更多的块来创建索引,所以update,insert性能低) 复合主键的原理 ...
  • 角色菜单按钮表,需要根据角色ID菜单ID 查询出 此角色当前菜单对应的按钮信息 Repository @Repository public interface RoleMenuBtnQueryRepository extends JpaRepository<RoleMenuBtn, RoleMenuBtnDTO> { ...
  • Oracle 查询复合主键重复值

    千次阅读 2010-01-22 09:59:00
    UPDATE teacherSET name = REPLACE(name, , ) 

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,272
精华内容 12,508
关键字:

关联查询复合主键