精华内容
下载资源
问答
  • 联合主键
    2022-03-25 16:18:38
    //含有联合主键的映射
    @Entity
    @Getter
    @Setter
    @Table(name = "sign_table")
    @IdClass(InfoLeadersId.class)
    public class InfosLeaders extends BaseEntity implements Serializable {
        @Id
        @Column(name = "info_id")
        private Long infoId;
        @Id
        @Column(name = "user_id")
        private Long userId;
    }
    
    //联合主键类
    @Getter
    @Setter
    public class InfoLeadersId implements Serializable {
        private static final long serialVersionUID = 1L;
        private Long infoId;
        private Long userId;
    
        @Override
        public int hashCode() {
            return Objects.hash(infoId, userId);
        }
    
        @Override
        public boolean equals(Object obj) {
            if (obj instanceof InfoLeadersId) {
                InfoLeadersId key = (InfoLeadersId) obj;
                if (this.userId.equals(key.getUserId()) && this.infoId.equals(key.getInfoId())) {
                    return true;
                }
            }
            return false;
        }
    }

    更多相关内容
  • PRIMARY KEY联合主键

    2020-12-14 09:32:40
    阅读指南基本概念创建表时定义主键约束修改表时定义主键约束删除主键约束 ...当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。 创建表时定义主键约束
  • 主要介绍了java hibernate使用注解来定义联合主键的相关资料,需要的朋友可以参考下
  • 代码如下: ALTER TABLE 表名字 ADD CONSTRAINT pk_表名字 PRIMARY KEY( SNumber, SDate );... 您可能感兴趣的文章:sql server创建复合主键的2种方法MySQL 创建主键,外键和复合主键的语句初探SQL语句复合主键与联合主键
  • 一、复合主键  所谓的复合主键 就是指你表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键。 比如 create table test ( name varchar(19), id number, value varchar(10), primary key ...
  • 本节文章主要介绍了oracle删除主键查看主键约束及创建联合主键,示例代码如下,需要的朋友可以参考下
  • 原生的sqoop在迁移联合主键的表至hive时,只能识别一个主键,导致数据覆盖。本资源是把sqoop的源码按照官方推荐的issue解决方案重新编译后的版本。sqoop-1.4.7.bin__hadoop-2.6.0-2020.0508.tar.gz是已完成编译的tar...
  • 第一、将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将该类注解为@Embeddable,最后在主类中(该类不包含联合主键类中的字段)保存该联合主键类的一个引用,并...
  • 主要介绍了Spring Data JPA 建立表的联合主键。本文详细的介绍了2种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 今天小编就为大家分享一篇python django model联合主键的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • JPA联合主键

    2019-08-12 01:00:05
    NULL 博文链接:https://profound-accumulation.iteye.com/blog/2242299
  • JPA 联合主键

    2019-05-26 01:42:20
    JPA 联合主键实例 博文链接:https://zmx.iteye.com/blog/512468
  • oracle添加联合主键,oracle联合主键alter table tablename add constraint unionkeyname primary key (column1,column2);上面语句中:tablename为要添加联合约束的表unionkeyname为添加的联合约束的名称column1,...

    oracle添加联合主键,oracle联合主键

    alter table tablename add constraint unionkeyname primary key (column1,column2);

    上面语句中:

    tablename为要添加联合约束的表

    unionkeyname为添加的联合约束的名称

    column1,column2为联合主键作用的两个列列名

    oracle建立联合主键

    alter table xxx add constraints xxx_pk primary key (c1,c2,c3,c4,c5....);

    Oracle中怎设置联合主键?(举例说明)

    建表时候设置

    CREATE TABLE TAB (

    ID1 NUMBER(10) ,

    ID2 NUMBER(4),

    CREDIT NUMBER(2),

    CONSTRAINT PK_TAB PRIMARY KEY (ID1,ID2) -- 主键

    );

    或者建表之后追加

    alter table tab add constraint pk_tab2 primary key (id1,id2);

    http://www.htsjk.com/shujukunews/2690.html

    www.htsjk.Com

    true

    http://www.htsjk.com/shujukunews/2690.html

    NewsArticle

    oracle添加联合主键,oracle联合主键 alter table tablename add constraint unionkeyname primary key (column1,column2); 上面语句中: tablename为要添加联合约束的表 unionkeyname为添加的联合约束的名称 column1,...

    本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.

    同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。

    展开全文
  • 联合主键和索引

    千次阅读 2022-03-30 11:13:59
    今天,看到一个表,是联合主键的。以前,确实也看到过联合主键,还建立过联合主键。今天,正好看到了,就对联合主键和索引的知识进行重新整理下。 主键和索引的关系为: 1)主键一定是索引; 2)索引是可以自建的...

    今天,看到一个表,是联合主键的。以前,确实也看到过联合主键,还建立过联合主键。今天,正好看到了,就对联合主键和索引的知识进行重新整理下。

    主键和索引的关系为:

    1)主键一定是索引;

    2)索引是可以自建的,非主键;

    3)索引是一种数据结构,方便查找。

    联合主键的本质,就是一个联合起来造成的索引,用来作为表的主键。

    但联合主键要想用起来,必须采用如下原则:“大哥不能丢,兄弟不能断”。如下所示:

    create table test
    
    (
    
       name varchar(21),
    
       id number,
    
       value varchar(20),
    
       primary key (name,id,value)
    
    )

    要想让联合主键生效,必须让第一个索引项name(大哥)存在;同时,如果想用name和value的索引,中间必须用id(兄弟不能断)。

    即:

    1)用name、id、value,可以用主键索引;(大哥在,兄弟没断)

    2)用name、id,,可以用主键索引;(大哥在,兄弟没断)

    3)用name,,可以用主键索引;(大哥在)

    4)用id、value,不可以用主键索引;(大哥不在)

    5)用id,不可以用主键索引;(大哥不在)

    6)用value,不可以用主键索引;(大哥不在)

    7)用name、value,不可以用主键索引;(大哥在,但兄弟断了)

    之所以会存在上门原因,是因为,索引的建立,是通过顺序建立的(先name,再id,再value);如果顺序出现偏误,则无法使用。

    展开全文
  • 数据库设计的三大范式~联合主键 什么是范式 为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中,这种规则就是范式。范式是符合某一种级别的关系模式的集合。关系型数据库中的...

    数据库设计的三大范式~联合主键

    什么是范式

    为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中,这种规则就是范式。范式是符合某一种级别的关系模式的集合。关系型数据库中的关系必须满足一定的要求,即满足不同的范式。

    目前关系型数据库有六种范式,分别为:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。要求最低的范式是第一范式。第二范式在第一范式的基础上又进一步的添加了要求,其余范式依次类推。

    一般说来,数据库只需满足第三范式就行了,而通常我们用的最多的就是第一范式、第二范式、第三范式,也就是接下来要讲的“三大范式”。

    第一范式

    第一范式(1NF)用来确保每列的原子性,要求每列(或者每个属性值)都是不可再分的最小数据单元(也称为最小的原子单元)。

    举例:

    员工编号员工姓名部门岗位员工工资
    EM71001张无忌网络部软件开发工程师8000
    EM71002楚天南运营部运营总监8100
    EM71003梁萧销售部售货员8300

    上表中的部门岗位字段不符合第一范式,可以拆分为“部门”和“岗位”两个字段。

    分解后方便我们对部门和岗位进行单独查询

    员工编号员工姓名部门岗位员工工资
    EM71001张无忌网络部软件开发工程师8000
    EM71002楚天南运营部运营总监8100
    EM71003梁萧销售部售货员8300

    不符合第一范式导致问题

    • 部门和岗位作为一个表中一个字段进行设计,当我们需要对某个员工的部门或者岗位无法进行单独查询获取数据。

    第二范式

    在说明第二范式之前我们需要先了解什么是联合主键,什么是复合主键

    什么是联合主键和复合主键

    联合主键就是用2个或2个以上的字段组成主键。形式上复合主键就是联合主键,由多个字段作为主键,将记录形成一个唯一性。

    场景1:

    可以这么理解,比如,你的订单表里有很多字段,一般情况只要有个订单号bill_no做主键就可以了,但是,现在要求可能会有补 充订单,使用相同的订单号,那么这时单独使用订单号就不可以了,因为会有重复。那么你可以再使用个订单序列号bill_seq来 作为区别。把bill_no和bill_seq设成联合主键。即使bill_no相同,bill_seq不同也是可以的。alter table 表 add constraint pk_name primary key (列1,列2,…)

    场景2:

    联合主键通常用来表达多表之间的多对多的关系,比如老师(teacher)、学生(student)之间是多对多的关系,老师表和学生表之间就需要通过一个中间表来表达这种多对多的关系。

    在这个中间表中就需要主键一个主键(mysql中不生成主键会怎么样)方便我们对表的查询,我们就可以将两个表中的编号字段拿到中间表中作为联合主键,学生编号字段中记录可以重复,老师编号字段中记录也可以重复,只要保障学生编号和老师编号两者一起唯一性即可,我们也不需要重新设置一个无关字段来作为主键增加数据的冗余性。

    **联合主键的好处是不需要因为需要主键而增加一个无用的主键列 **
    例如如果不用联合主键你必须增加个列ID设置主键 ,但这个ID列 无任何作用 至于在什么情况下使用,就像刚才举例的,当你这个表的主键ID无任何用处,那么就用联合主键好了,你可以节约 一个列的空间,但如果这表的ID列要做为别的表的外键的话,就不能用联合主键了。
    **联合主键就是确定一条记录的唯一性啊 **

    联合主键(复合主键)就是多个字段一起作为主键,mysql数据库会自动创建复合索引(联合索引),注意:多字段的联合索引需要同时创建,同时删除,否则报错Multiple primary key defined。当定义了一个主键,无法使用alter命令再添加一个主键,否则报错Multiple primary key defined,需要删除原来主键(alter table 表名 drop primary key),将多个字段同时设置为主键

    什么是第二范式

    第二范式(2NF)在第一范式的基础上更进一层,要求表中的每列都和主键相关,即要求实体的唯一性。如果一个表满足第一范式,并且除了主键以外的其他列全部都依赖于该主键,那么该表满足第二范式。

    在满足第一范式基础上要求每个字段都和主键完整相关,而不是仅和主键部分相关(主要针对联合主键而言

    订单编号产品编号产品价格产品数量订单金额下单时间
    DN001CN577810022002019.12.3
    DN002CN577812044802020.11.3

    “订单详情表”使用“订单编号”和“产品编号”作为联合主键。此时“产品价格”、“产品数量”都和联合主键整体相关,但“订单金额”和“下单时间”只和联合主键中的“订单编号”相关,和“产品编号”无关。所以只关联了主键中的部分字段,不满足第二范式。
    把“订单金额”和“下单时间”移到订单表就符合第二范式了。

    订单编号产品编号产品价格产品数量
    DN001CN57781002
    DN002CN57781204
    订单编号订单金额下单时间
    DN0012002019.12.3
    DN0024802020.11.3

    主键与外键在多表中的重复出现不属于数据冗余,非键字段的重复出现才是数据冗余。

    第二范式避免了数据冗余和减少插入异常。

    第三范式

    第三范式(3NF)在第二范式的基础上更进一层,第三范式是确保每列都和主键列直接相关,而不是间接相关,即限制列的冗余性。如果一个关系满足第二范式,并且除了主键以外的其他列都依赖于主键列,列和列之间不存在相互依赖关系,则满足第三范式。

    员工编号员工姓名部门岗位员工工资
    EM71001张无忌网络部软件开发工程师8000
    EM71002楚天南运营部运营总监8100
    EM71003梁萧销售部售货员8300

    上面表中的“部门名称”和“员工编号”的关系是“员工编号”→“部门编号”
    →“部门名称”,不是直接相关。此时会带来下列问题:

    • 数据冗余:“部门名称”多次重复出现。
    • 插入异常:组建一个新部门时没有员工信息,也就无法单独插入部门信息。就算强行插入部门信息,员工中没有员工信息的记录同样是非法记录。
    • 删除异常:删除员工信息会连带删除部门信息导致部门信息意外丢失。
    • 更新异常:哪怕只修改一个部门的名称也要更新多条员工记录。

    正确的做法是:把上表拆分成两张表,以外键形式关联

    员工编号员工姓名部门岗位员工工资
    EM71001张无忌001软件开发工程师8000
    EM71002楚天南002运营总监8100
    EM71003梁萧003售货员8300
    员工编号部门
    001网络部
    002运营部
    003销售部

    “部门编号”和“员工编号”是直接相关的。
    第二范式的另一种表述方式是:两张表要通过外键关联,不保存冗余字段。例
    如:不能在“员工表”中存储“部门名称”。

    反范式化~突破范式

    规则的变通

    我们需要知道对于项目的最终用户来说,用户关心的是方便,清晰的数据结果。所以在设计数据库时,设计人员和客户在数据库的设计规范化和性能之间会有一定的矛盾。三大范式是设计数据库表结构的规则约束,但是在实际开发中允许局部变通。

    比如为了快速查询到关联数据可能会允许冗余字段的存在。例如在员工表中存储部门名称虽然违背第三范式,但是免去了对部门表的关联查询。

    根据业务功能设计数据库表

    1、看得见的字段
    能够从需求文档或原型页面上直接看到的数据都需要设计对应的数据库表、字段来存储。

    比如根据设计页面可以知道用户信息需要包含如下字段:

    • 账号
    • 密码
    • 名称
    • 邮箱地址

    2、看不见的字段
    除了能够直接从需求文档中看到的字段,实际开发中往往还会包含一些其他字段来保存其他相关数据。
    例如:管理员表需要再增加如下字段以有利于数据维护

    • 主键
    • 创建时间
    • 冗余字段

    为了避免建表时考虑不周有所遗漏,到后期再修改表结构非常麻烦,所以也有的团队会设置一些额外的冗余字段备用。

    反范式化优缺点

    优点:

    • 可以减少表的关联
    • 可以更好的进行索引优化

    缺点:

    • 数据表存在数据冗余及数据维护异常
    • 对数据的修改需要更多的成本

    数据库范式的优缺点

    优点

    • 减少数据冗余
    • 消除异常(插入异常,更新异常,删除异常)

    缺点

    • 查询时需要联合多表查询,增加了查询的复杂度
    • 查询时需要联合多个表,降低了数据库查询性能

    总结

    由上可以看出,为了满足三大范式,我们的数据操作性能会受到相应的影响。

    对于应用数据库范式进行分解的过程中不难看出,应用的范式登记越高,则表越多。表多会带来很多问题;所以不是应用的范式越高越好,要看实际情况而定。第三范式已经很大程度上减少了数据冗余,并且减少了造成插入异常,更新异常,和删除异常了。我个人观点认为,大多数情况应用到第三范式已经足够,在一定情况下第二范式也是可以的。

    补充:MySQL InnoDB数据表缺少主键会怎样—知乎(https://zhuanlan.zhihu.com/p/98084061)

    问题

    MySQL数据表使用InnoDB作为存储引擎的时候,数据结构就是使用B+树,而数据本身存储在主键索引上,也就是通常所说的聚簇索引,也就是每个表都需要有个聚簇索引树,但是,在建表的时候却发现可以不用指定主键,那么MySQL对于没有指定主键的表示如何处理的呢?

    InnoDB索引

    对于InnoDB,可以简单地把所有数据视为索引,每一个索引都对应一个B+数,而主键对应的索引就是聚簇索引,表的所有数据都存储在聚簇索引上,而除了聚簇索引的普通索引存储的只是主键的引用,所以,查询的时候对于普通索引需要进行回表才能取到具体数据。

    缺少主键MySQL如何处理

    既然InnoDB对数据的存储必须依赖于主键,那么对于没有创建主键的表,该怎么办?

    InnoDB对聚簇索引处理如下: - 如果定义了主键,那么InnoDB会使用主键作为聚簇索引 - 如果没有定义主键,那么会使用第一非空的唯一索引(NOT NULL and UNIQUE INDEX)作为聚簇索引 - 如果既没有主键也找不到合适的非空索引,那么InnoDB会自动生成一个不可见的名为ROW_ID的列名为GEN_CLUST_INDEX的聚簇索引,该列是一个6字节的自增数值,随着插入而自增

    很明显,缺少主键的表,InnoDB会内置一列用于聚簇索引来组织数据。而没有建立主键的话就没法通过主键来进行索引,查询的时候都是全表扫描,小数据量没问题,大数据量就会出现性能问题。

    但是,问题真的只是查询影响吗?不是的,对于生成的ROW_ID,其自增的实现来源于一个全局的序列,而所以有ROW_ID的表共享该序列,这也意味着插入的时候生成需要共享一个序列,那么高并发插入的时候为了保持唯一性就避免不了锁的竞争,进而影响性能。

    Returns a new row id.
     @return the new id */
     UNIV_INLINE
     row_id_t
     dict_sys_get_new_row_id(void)
     {
        row_id_t  id;
    
        mutex_enter(&(dict_sys->mutex));
    
        id = dict_sys->row_id;
    
        if (0 == (id % DICT_HDR_ROW_ID_WRITE_MARGIN)) {
    
          dict_hdr_flush_row_id();
        }
    
        dict_sys->row_id++;
    
        mutex_exit(&(dict_sys->mutex));
    
        return(id);
     }
    

    缺少主键或者非空索引存在问题

    • 使用不了主键索引,查询会进行全表扫描
    • 影响数据插入性能,插入数据需要生成ROW_ID,而生成的ROW_ID是全局共享的,并发会导致锁竞争,影响性能

    为每个表设置主键

    既然知道InnoDB对数据的存储和处理都是基于聚簇索引的,那么,在建表时候要注意主键的重要性,为每个表都设置一个主键,如果没有合适的字段来作为主键,可以设置一个业务无关的的代理主键,可以是自增ID,也可以是UUID(建议使用自增ID,性能较好)。

    总结

    在理解InnoDB的数据结构之后自然而然就会知道主键的重要性,在建表的时候也不会忘记设置主键,无论表设计有无合适的唯一字段,都需要设置一个主键,提高性能的同时也是一种好的习惯,对于后续的拓展以及表之间关联都有一定的拓展性。

    参考文章

    • http://todorex.com/2018/05/10/数据库/数据库范式/
    • http://c.biancheng.net/view/8264.html
    • https://www.cnblogs.com/CNty/p/10941398.html
    • https://www.cnblogs.com/UniqueColor/p/7234340.html
    • https://www.cnblogs.com/saoge/p/14431536.html
    展开全文
  • Jpa联合主键

    千次阅读 2021-09-06 20:25:51
    Jpa联合主键 项目背景:SpringBoot+jpa+h2数据库。 本菜鸟接了个需求,在数据库里增加一些数据。sql语句发过来了,如下所示: INSERT INTO st_report_template(hosp_cde, section, path, last_upd_usr, last_upd_dt,...
  • NULL 博文链接:https://cdxs2.iteye.com/blog/1932507
  • 联合主键就是用2个或2个以上的字段组成主键。 用这个主键包含的字段作为主键,这个组合在数据表中是唯一,且加了主键索引。 可以这么理解,比如,你的订单表里有很多字段,一般情况只要有个订单号bill_no做主键就...
  • mybatis-plus支持联合主键

    千次阅读 2022-03-29 10:26:57
    背景:由于在项目中是需要使用联合主键,但是mp本身对联合主键支持非常不友好,现开发一个联合主键 (1)注解定义 在需要使用的实体上加上@MutiId,其中ids表示联合主键的数组 @Retention(RetentionPolicy....
  • 联合主键自增问题今天上午闲来无事翻看了下数据库分类表的设计,看到这样一幕:当时我好奇的是怎么cateId自增会存在重复值的问题,然后翻看了下主键是由siteId和cateId组成。所以进行了查阅资料:当多列组成联合...
  • oracle数据库联合主键

    2021-05-02 01:29:21
    ⑤语法: 1.StudentID int not null primary key 创建学生编号为主键 2.primary key(Students) 创建学生编号为主键 3.primary key(StudentID,Email) 创建学生ID和Email为联合主键 ⑥为已存在的列创建主键 1.alter ...
  • Mysql 创建联合主键

    千次阅读 2021-01-18 18:27:01
    Mysql 创建联合主键2008年01月11日 星期五 下午 5:21使用primary key (fieldlist)比如:...aa,bb为联合主键不知道是不是因为mysql(6.0)的版本问题,还是各版本都是这种情况,mysql中创建联合主键联合主键列名之外...
  • 概念: ...主键约束(primary key) PK 自增长约束(auto_increment) 非空约束(not null) 唯一性约束(unique) 默认约束(default) 零填充约束(zerofill) 外键约束(foreign key) FK 主键约束 My
  • ⑤语法: 1.StudentID int not null primary key 创建学生编号为主键 2.primary key(Students) 创建学生编号为主键 3.primary key(StudentID,Email) 创建学生ID和Email为联合主键 ⑥为已存在的列创建主键 1.alter ...
  • sqlite创建表联合主键的sql写法
  • mysql添加联合主键

    千次阅读 2022-04-23 14:12:16
    联合主键,指的是把两个列看成是一个整体,这个整体是不为空,唯一,不重复 1.创建表的同时创建联合主键 格式: create table 表名( 列名1 数据类型, 列名2 数据类型, constraint 主键约束的名字 primary key...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 86,768
精华内容 34,707
关键字:

联合主键