精华内容
下载资源
问答
  • 数据库主键可以有几个
    千次阅读
    2021-09-15 22:20:55

    关系型数据库中,用户在建表时,只能有一个主键,不可能有多个主键的,但有时候我们碰到关系S和我们的关系C存在多对多的联系,在关系数据库中,多对多联系必须建立一个关系模式,而该模式的码是联系两端实体的码加上联系的属性构成的,这时候就会出现一张表中有多个主键,我们称之为联合主键,多个字段放在一起作为作为一张表的主键主键的主键的作用是保证数据的唯一性和完整性,同时通过主键检索表能够增加检索速度。

    Create TABLE SC(
    Sno char(6) ,
    Pno  char(6) ,
    Status char(8),
    Qty    NUMERIC(9),
    primary key(Sno,Pno),
    foreign key(Sno) REFERENCES S(Sno),
    foreign key(Pno) REFERENCES P(Pno)
    
    )engine=INNODB  charset=utf8;

    更多相关内容
  • 数据库主键,指的是一列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表的实体完整性;主键主要是用与其他表的外键关联,以及本记录的修改与删除。数据库的单个数据表中只能主键。数据库主键,...

    数据库的单个数据表中只能有一个主键。数据库主键,指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表的实体完整性;主键主要是用与其他表的外键关联,以及本记录的修改与删除。

    4de34d12abcfac82c43c135eac5ca543.png

    数据库的单个数据表中只能有一个主键。

    数据库主键,指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表的实体完整性。主键主要是用与其他表的外键关联,以及本记录的修改与删除。

    1、数据库的每张表只能有一个主键,不可能有多个主键。

    2、所谓的一张表多个主键,我们称之为联合主键。

    注:联合主键:就是用多个字段一起作为一张表的主键。

    3、主键的主键的作用是保证数据的唯一性和完整性,同时通过主键检索表能够增加检索速度。

    下面聊聊怎么创建联合主键:

    1、GUI中同时选中多列,点击设置为主键。

    2、sql语句将多列设置为主键:

    一种是在建表时就写出,语句如下:Create Table 表名 (字段名1 Int Not Null,

    字段名2 nvarchar(13) Not Null Primary Key (字段名1, 字段名2),

    字段名3…………

    字段名N………… )

    另一种是在建表后更改,语句如下:ALTER TABLE 表名 WITH NOCHECK ADD

    CONSTRAINT [PK_表名] PRIMARY KEY NONCLUSTERED

    (

    [字段名1],

    [字段名2]

    )

    推荐教程:《sql视频教程》

    展开全文
  • 数据库主键的设计

    千次阅读 2022-02-11 13:58:04
    一、数据库主键的设计原则 主键和外键是把多表组织为一有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。主键和外键的结构是将数据库模式从理论上的逻辑设计转换为...

    九种分布式ID生成方式

    一、数据库主键的设计原则

    主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。主键和外键的结构是将数据库模式从理论上的逻辑设计转换为实际的物理设计。一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。

    主键:关系数据库依赖于主键—它是数据库物理模式的基石。它确定了关系数据库的实体完整性约束,主键在物理层面上只有两个用途:

    1. 惟一标识一行。
    2. 作为一个可以被外键有效引用的对象。

    基于以上这两个用途,设计物理层面的主键要遵循以下原则:

    1️⃣主键应当是对用户没有意义的:
    如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。

    2️⃣主键应该是单列的,以便提高连接和筛选操作的效率:
    使用复合键的人通常有两个理由为自己开脱,而这两个理由都是错误的。其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便;其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,但是复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。

    3️⃣永远也不要更新主键:
    因为主键除了惟一标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。

    注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。

    4️⃣主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。

    5️⃣主键应当由计算机自动生成:
    如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。

    二、数据库主键的数据类型的选择

    1️⃣自增主键,在 MySQL 中应用最广泛。
    如果是微型系统,而且肯定数据库建好了就不会动了,数据也不会去动,那么数据库主键就用自增 int 就够了。

    优点:

    1. 需要很小的数据存储空间,仅仅需要 4 byte。(bigint类型,是8 byte)
    2. insert 和 update 操作时使用 int 的性能比 UUID 好,所以使用 int 将会提高应用程序的性能。
    3. index 和 Join 操作,int 的性能最好。
    4. 容易记忆。

    缺点:

    1. 如果经常有合并表的操作,就可能会出现主键重复的情况。
    2. 使用 int 数据范围有限制。如果存在大量的数据,可能会超出 int 的取值范围。
    3. 很难处理分布式存储的数据表。

    2️⃣UUID
    如果是比较中大型的系统,比如电商网站,erp,crm之类的系统,主键最好用 UUID,可以保证数据的唯一性,而且数据迁移数据合并分库分表的时候会更省心,如果是 int 主键,数据迁移和合并会很麻烦,如果涉及到外键关联,更要考虑主键 ID 重复性的问题,所以宁肯牺牲一点性能使用 UUID 做主键,长远考虑带来的好处远超过 int 带来的这点性能优势。

    优点:

    1. 能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。
    2. 保证生成的 ID 不仅是表独立的,而且是库独立的,这点在想切分数据库的时候尤为重要。

    缺点:

    1. 比较占地方,和 int 类型相比,存储一个 UUID 要花费更多的空间。
    2. 使用 UUID 后,URL 显得冗长,不够友好。
    3. 没有内置的函数获取最新产生的 UUID 主键。
    4. 很难记忆。Join 操作性能比 int 要低。
    5. UUID 做主键将会添加到表上的其他索引中,因此会降低性能。

    三、MySQL 的自增 ID 用完了,会如何?

    当继续 insert 时,使用的自增 ID 还是该字段类型的最大值(2147483647),报主键冲突的错误。

    四、面试:分库分表之后,主键 id 如何处理?(唯一性,排序等)

    分库分表必然要面对的一个问题,就是 id 如何生成?因为分成多个表之后,每个表肯定不能都从 1 开始累加;还有排序问题等。比较典型的,如下:

    1️⃣主键冲突问题
    分库分表的环境中,数据分布在不同的分片上,不能再借助数据库自增长特性直接生成,否则会造成不同分片上的数据表主键会重复。

    2️⃣事务问题
    在执行分库分表之后,由于数据存储到了不同的库上,数据库事务管理出现了困难。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价;如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。

    3️⃣跨库跨表的join问题
    在执行了分库分表之后,难以避免会将原本逻辑关联性很强的数据划分到不同的表、不同的库上。此时,表的关联操作将受到限制,无法 join 位于不同分库的表,也无法 join 分表粒度不同的表,结果原本一次查询能够完成的业务,可能需要多次查询才能完成。

    解决方案

    1️⃣数据库自增 id
    系统往一个库的一个表里插入一条没什么业务意义的数据,然后获取一个数据库自增的一个 id。拿到这个 id 之后再往对应的分库分表里去写入。

    优点方便简单,谁都会用;缺点就是单库生成自增 id,要是高并发的话,就会有瓶颈。如果硬是要改进一下,那么就专门开一个服务出来,这个服务每次就拿到当前 id 最大值,然后递增几个 id,一次性返回一批 id,然后再把当前最大 id 值修改成递增几个 id 之后的一个值;但是无论如何都是基于单个数据库。

    2️⃣UUID
    优点就是本地生成,不需要依赖数据库。缺点就是,UUID 太长了,作为主键性能太差了,另外 UUID 不具有有序性,会造成 B+ 树索引在写的时候有过多的随机写操作,频繁修改树结构,从而导致性能下降。

    适合的场景:如果要随机生成文件名、编号之类的,适合用 UUID。
    UUID.randomUUID().toString().replaceAll("-","");

    3️⃣获取系统当前时间
    这个就是获取当前时间即可,并发很高的时候,比如一秒并发几千,会有重复的情况,这个是肯定不合适的。

    适合的场景:一般如果用这个方案,是将当前时间跟很多其他的业务字段拼接起来,作为一个 id,如果业务上可以接受,那么也是可以的。可以将别的业务字段值跟当前时间拼接起来,组成一个全局唯一的编号。

    4️⃣snowflake 算法

    展开全文
  • 主键是非常不幸的符号,因为“初级”的内涵和与逻辑模型有关的潜意识联想。 因此我避免使用它。 相反,我指的是物理模型的代理键和逻辑模型的自然键。重要的是,每实体的逻辑模型至少具有一组“业务属性”,其包括...

    主键是非常不幸的符号,因为“初级”的内涵和与逻辑模型有关的潜意识联想。 因此我避免使用它。 相反,我指的是物理模型的代理键和逻辑模型的自然键。

    重要的是,每个实体的逻辑模型至少具有一组“业务属性”,其包括实体的密钥。 Boyce,Codd,Date等在关系模型中将这些称为候选键。 然后,当我们为这些实体构建表时,它们的候选键在这些表中成为自然键。 只有通过那些自然键,用户才能唯一地识别表中的行; 因为代理键应始终对用户隐藏。 这是因为代理键没有商业意义。

    然而,在没有代理键的情况下,我们的表的物理模型在许多情况下效率低下。 回想一下,非聚集索引的非覆盖列只能通过密钥查找(通常)找到聚簇索引(忽略作为堆积实现的表)。 当我们的可用自然密钥很宽时,这(1)扩大了我们的非聚簇叶节点的宽度,增加了存储要求,并且对非聚集索引的搜索和扫描进行了读取访问; (2)减少聚集索引的扇出,增加索引高度和索引大小,再次增加聚簇索引的读取和存储要求; (3)增加了我们的聚簇索引的缓存要求。 从缓存中追逐其他索引和数据。

    这是一个小的代理键,被指定为RDBMS作为“主键”证明是有益的。 当设置为聚类键时,为了用于从非聚集索引和相关表中的外键查找中查找聚簇索引的键,所有这些缺点都消失了。 我们的聚簇索引扇出再次增加以减少聚簇索引的高度和大小,减少聚簇索引的缓存负载,减少通过任何机制访问数据时的读取(无论是索引扫描,索引搜索,非聚簇键查找还是外键查找) 并降低表的聚簇索引和非聚簇索引的存储要求。

    请注意,仅当代理键很小且聚类键时才会发生这些好处。 如果GUID用作聚类键,则情况通常比使用最小可用自然键时更糟。 如果表被组织为堆,则8字节(堆)RowID将用于键查找,这比16字节GU

    展开全文
  • 1、数据库的每张表只能个主键,不可能个主键。 2、所谓的一张表多个主键,我们称之为联合主键。 注:联合主键:就是用多字段一起作为一张表的主键。 3、主键主键的作用是保证数据的唯一性和完整性,...
  • 62616964757a686964616fe58685e5aeb931333366306538外键就是自己设置了也即可以有,可以设置除主键以外的其他字段全部是外键的。数据库的每张表只能有一个主键,不可能有多个主键。所谓的一张表多个主键,我们称...
  • 数据库主键

    千次阅读 2021-08-16 10:40:57
    1、数据库的每张表只能个主键,不可能个主键。 2、所谓的一张表多个主键,我们称之为联合主键。 注:联合主键:就是用多字段一起作为一张表的主键。 3、主键主键的作用是保证数据的唯一性和完整性,同时...
  • 一张表可以有多少个主键

    千次阅读 2021-01-19 05:33:29
    转自:http://blog.csdn.net/for12/article/details/49300843今天在共工作...1、数据库的每张表只能个主键,不可能个主键。2、所谓的一张表多个主键,我们称之为联合主键。注:联合主键:就是用多字段一起...
  • 数据库主键和索引区别

    千次阅读 2021-01-12 10:47:21
    主键是为了标识数据库记录的唯一性,只能有一个主键主键其实也是一个特殊索引:主键索引(不可为空),是一种特殊的唯一索引...唯一索引表示该索引值唯一,可以由一个或者几个字段组成,一个表可以有多个唯一索引 ...
  • 关于数据库主键和外键(终于弄懂啦)

    万次阅读 多人点赞 2019-06-18 15:59:59
    转 关于数据库主键和外键(终于弄懂啦) 2018年07月16日 19:44:24 f45056231p 阅读数 19385 ...
  • 看了b站IT老齐的架构三百讲的其中一短视频,有所体会并记录一下。视频中所讲的财经部门使用的UUID主键,在日终结算时出现磁盘的IO异常,导致应用出现高延迟。最后发现是UUID的问题,UUID作为主键在数据进行插入的...
  • 浅谈关系型数据库主键设置策略

    万次阅读 2021-03-14 21:21:12
    几乎大多数的应用都会使用关系型数据库进行数据存储,而主键一定是标配。那么,在您的应用中,通常使用什么方案来满足业务扩张呢?下面简单介绍普遍做法以及改进之道。 第一层:业务布局之初。众所周知,企业业务刚...
  • 一. 面试题及剖析 1. 今日面试题 数据库主键怎么生成?...主键一般是作为数据库表格里的第一字段,其特殊意义和作用,面试官可以通过我们对主键的理解情况,来考察我们对数据库设计的能力。尤其是关
  • 数据库主键 4种类型及6种约束

    万次阅读 2018-03-27 13:29:43
    导读:在看《SQL必知必会(第四版)》看到运用外键建立表关系,联想到工作时建表主键类型的选择问题,查资料的时候遇到了比较简洁的一文章; 1. 基础理论: 1.主键和外键的设计原则。 a. 主键应尽量分离于业务的...
  • 关于数据库主键和外键,索引

    千次阅读 2018-06-28 18:18:29
    关系型数据库中的一条记录中若干属性,若其中某一属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每学生的学号是唯一的,学号就是一个主键 ...
  • 数据库主键与索引

    2020-06-02 18:52:52
    关系型数据库中的一条记录中若干属性,若其中某一属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如: 学生表(学号,姓名,性别,班级) 其中每学生的学号是唯一的,学号就是一个主键 ...
  • 数据库主键设计

    千次阅读 2019-02-20 10:02:35
    数据库主键
  • 分布式数据库主键方案 详解

    千次阅读 2018-03-16 23:34:51
    但在集群、主从架构上时就会一些问题,比如 : 主键的全局唯一在集群环境下除自增ID 外的其它创建主键的方案1> 通过应用程序生成一 GUID,然后和数据一起插入切分后的集群优点 : 维护简单,实现也容易缺点...
  • 关系型数据库中的一条记录中若干属性,若其中某一属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每学生的学号是唯一的,学号就是一个主键 课程...
  • 数据库主键生成方案

    千次阅读 2018-04-19 22:23:48
    问题产生的背景:数据量到达一定程度时,需要做数据的分库分表(这又是一很值得讨论的问题,什么量级的数据做分库分表),此时我们需要保证数据库主键的唯一性、单调递增。并且获取唯一主键的服务要保证高可用、高...
  • 数据库主键设计原则

    万次阅读 2017-07-08 10:52:49
    阅读《阿里 Java 开发手册》时,以下 MySQL 建表规约: 表必备三字段:id, gmt_create, gmt_modified。 说明:其中id必为主键,类型为unsigned bigint、单表时自增、步长为1。gmt_create, gmt_modified的类型均...
  • 关系数据库中,主键是(1___),主键的建立(2___)种方法,当运用Transact-SQL语句创建主键时,可以是(3___)。⑴A、为标识表中唯一的实体B、创建唯一的索引,允许空值C、只允许以表中第一字段建立D、允许个主键的...
  • 数据库设计中主键字段类型的选择

    千次阅读 2021-01-18 18:44:21
    很久都没有写过博客了,从最后一次发表的文章到现在已经是...做web 开发时,经常要与数据库交互,数据库主键的选择也犹为重要,怎么么选择数据库主键字段的类型,主要从以下几个方面考虑:1. 首先要符合业务需求,这...
  • MySQL数据库主键冲突的三种解决方案

    千次阅读 2021-01-18 20:57:19
    业务中为了避免重复数据的产生,除了在代码层级做处理之外,还会在数据库表中增加唯一索引来做最后的校验,项目中唯一索引在冲突的时候是以代码抛异常的形式来阻止脏数据的产生,而异常这东西,说好也好,说不好也...
  • 最近学习一点数据库的基本知识,被一问题困惑了许久:主键是唯一的索引,那么为何一可以创建多个主键呢? 其实“主键是唯一的索引”这话有点歧义的。举例子,我们在表中创建了一ID字段,自动增长,并设为...
  • 关系型数据库主键外键

    千次阅读 2021-01-11 21:55:07
    一对多:把表A的主键充当表B的外键(一个父亲有几个孩子,一个孩子只有一个父亲) 多对多:必须通过单独的一张表来实现(一个老师多个学生,一个学生多个老师)班级一张表,老师一张表,班级和老师的关系一张表 主键:...
  • mysql的主键有种?如何做选择?

    千次阅读 2021-06-03 20:42:06
    zhu (1). 自增序列; (2). UUID()函数生成的随机值; (3). 用户注册的唯一性帐号名称,字符串类型,一般长度为:40字符; (4). 基于一套机制生成类似自增的值,比如序列生成器;

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 219,522
精华内容 87,808
关键字:

数据库主键可以有几个