-
2021-02-01 22:39:35
主键是非常不幸的符号,因为“初级”的内涵和与逻辑模型有关的潜意识联想。 因此我避免使用它。 相反,我指的是物理模型的代理键和逻辑模型的自然键。
重要的是,每个实体的逻辑模型至少具有一组“业务属性”,其包括实体的密钥。 Boyce,Codd,Date等在关系模型中将这些称为候选键。 然后,当我们为这些实体构建表时,它们的候选键在这些表中成为自然键。 只有通过那些自然键,用户才能唯一地识别表中的行; 因为代理键应始终对用户隐藏。 这是因为代理键没有商业意义。
然而,在没有代理键的情况下,我们的表的物理模型在许多情况下效率低下。 回想一下,非聚集索引的非覆盖列只能通过密钥查找(通常)找到聚簇索引(忽略作为堆积实现的表)。 当我们的可用自然密钥很宽时,这(1)扩大了我们的非聚簇叶节点的宽度,增加了存储要求,并且对非聚集索引的搜索和扫描进行了读取访问; (2)减少聚集索引的扇出,增加索引高度和索引大小,再次增加聚簇索引的读取和存储要求; (3)增加了我们的聚簇索引的缓存要求。 从缓存中追逐其他索引和数据。
这是一个小的代理键,被指定为RDBMS作为“主键”证明是有益的。 当设置为聚类键时,为了用于从非聚集索引和相关表中的外键查找中查找聚簇索引的键,所有这些缺点都消失了。 我们的聚簇索引扇出再次增加以减少聚簇索引的高度和大小,减少聚簇索引的缓存负载,减少通过任何机制访问数据时的读取(无论是索引扫描,索引搜索,非聚簇键查找还是外键查找) 并降低表的聚簇索引和非聚簇索引的存储要求。
请注意,仅当代理键很小且聚类键时才会发生这些好处。 如果GUID用作聚类键,则情况通常比使用最小可用自然键时更糟。 如果表被组织为堆,则8字节(堆)RowID将用于键查找,这比16字节GU
更多相关内容 -
为什么数据库表只有一个主键?
2021-02-03 09:41:01一个(关系)表"超级键"是每组在表中具有唯一子行的列集。 (请注意,超级密钥的每个超集也是一个超级密钥。)(简单的SQL KEY声明了什么,以及那些超集。)不包含较小超级密钥的超级密钥是"候选密钥&...一个(关系)表"超级键"是每组在表中具有唯一子行的列集。 (请注意,超级密钥的每个超集也是一个超级密钥。)(简单的SQL KEY声明了什么,以及那些超集。)不包含较小超级密钥的超级密钥是"候选密钥"。规范化和其他关系理论关注候选键并且不关心主键。就查询,更新和约束的含义而言,没有必要或基础来选择一个候选密钥并将其称为“#34; primary" (和其他人#34;替代")。它只是从关系模型早期的关系前系统延续下来的传统,当时它并没有被理解为是不必要的。
索引的目的也是不必要的(必须具有性能,另一个重要的可观察表达式)。
然后,因为有一个传统的主键,其他东西(如自动索引)附加到他们身上。但是这些东西并不需要附加到主键上,主键不是那些其他东西所必需的。
SQL只允许你声明一个PRIMARY KEY,因为只有"假设"成为一个主键,但这并不意味着有充分的理由在附加功能之外声明任何内容。无论如何,SQL PRIMARY KEY实际上意味着UNIQUE NOT NULL,即超级密钥,而不是候选密钥,所以只有在UNIQUE NOT NULL的适当子集上没有声明PRIMARY KEY时才这样做列是它声明一个主键。因此,SQL PRIMARY KEY不一定是主键的事实表明声称对主键的需求是多么空。 (并且SQL FOREIGN KEY不是外键,因为它们不会引用任何但只有候选键(应该如此),甚至只引用任何但只有主键,或者甚至只引用{ {1}} s,它们只引用任何超级密钥。所以再次说明主键必要性的说法是空的。)
大多数SQL DBMS会自动且特别地索引PRIMARY KEY。但这只是向用户揭示某些实施方式的某种方式。
有时声称,使用单一方式引用核心业务实体可以证明拥有基表主键。但是,任何表表达式的任何超级键,即任何一个候选键的任何超集,都标识任何包含的超级键所做的一切(包括主键)。因此,即使实体的主键列不存在,查询仍然可以具有标识它的列。此外,任何表表达式的任何超级键都标识某个实体,无论它是否在某个基表中被标识(更不用说通过主键)。此外,即使通过查询对列进行了预测/ PRIMARY KEY,其行的含义仍然是根据保存这些列的表的含义。因此,查询,更新或约束可以再次涉及核心业务实体,而不存在其指定的主键列。并且它可以涉及没有关联的基本主键列的派生实体。因此声称主键是必需的或基本的或唯一识别是没有根据的。
-
Oracle报错:ORA-02260——表只能有一个主键
2021-12-07 10:38:41 -
数据库表中有多个“主键
2021-12-09 15:30:09数据库表中的多个主键称为联合...sql 中一个表设置两个主键是 将两个字段联合起来设置为主键 一个表只能有一个主键 1.只有id为主键时 2.id和name这2个列一起构成为联合主键时 甚至可以全部字段设置为主键 ...数据库表中的多个主键称为联合主键
sql 中一个表设置两个主键是 将两个字段联合起来设置为主键 一个表只能有一个主键
1.只有id为主键时
2.id和name这2个列一起构成为联合主键时
甚至可以全部字段设置为主键
-
数据库中一张表可以有多少个主键?
2020-12-04 20:52:391、数据库的每张表只能有一个主键,不可能有多个主键。 2、所谓的一张表多个主键,我们称之为联合主键。 注:联合主键:就是用多个字段一起作为一张表的主键。 3、主键的主键的作用是保证数据的唯一性和完整性,... -
MySQL索引之主键索引
2020-12-15 16:43:01一个表可以没有主键,但最多只能有一个主键,并且主键值不能包含NULL。 在MySQL中,InnoDB数据表的主键设计我们通常遵循几个原则: 1、采用一个没有业务用途的自增属性列作为主键; 2、主键字段值总是不更新,只有... -
外键必须是另一个表的主键吗 ?
2021-05-07 14:13:38比如学生表在设计的时候一般可以用学号作为主键,也可设计一个ID字段,字段由数据库自动生成且唯一。那么对于班级,一个班级对应多个学生,这个时候对于班级表和学生表之间的外键就可以用学生表的ID做外键。 如下所... -
数据库建表时一个表最多可以有几个主键,几个外键
2021-01-19 12:54:31展开全部主键只有一个,但是可以设置为多个字段为主键,也即联合主键。62616964757a686964616fe58685e5aeb931333366306538外键就是自己设置了也即可以有多个,可以设置除主键以外的其他字段全部是外键的。数据库的每... -
数仓业务上判断一个表的唯一主键是哪几个字段
2022-04-26 10:46:13平时业务量比较大,一张HIVE表里面的字段也比较多,如何判断所select 的这几个字段是这张表的唯一主键,也就是,选取这几个主键,可以唯一确定只有一行数据 可以通过,select A,B,C from table group by A,B,C ... -
MySQL 主键与索引的联系与区别分析
2021-01-19 22:24:35所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。主键除了上述... -
外键必须是另一个表的主键吗
2019-03-01 14:48:49不一定是主键,但必须是唯一性索引。 主键约束和唯一性约束都是唯一性索引。 FOREIGN KEY 约束 ...在外键引用中,当一个表的列被引用作为另一个表的主键值的列时,就在两表之间创建了链接。这... -
数据库设计时,每个表要不要都设置自增主键ID!(转)
2021-01-19 17:21:25一、确立主键规范每个了解数据库设计的人都知道,主键对于一张表来说是一个很重要,甚至必需的部分。这确实是事实,主键是好的数据库设计的一部分。主键是数据库确保数据行在整张表唯一性的保障。它是定位到一条记录... -
设置MySQL数据表主键
2021-01-28 00:39:07设置MySQL数据表主键:使用“primary key”关键字创建主键数据列。被设置为主键列不允许出现重复的值,很多情况下与“auto_increment”递增数字相结合。如下SQL语句所示:Mysql>createtablebooks(bookidint(11)... -
一张表可以有多少个主键
2015-10-21 10:20:28今天在共工作,做老项目维护的时候无意中发现一张表居然有三个主键。吓死宝宝了,然后尝试着建表建主键,但是都不能成功。 难道是我写的有问题,最后通过查资料总终于解决了。 1、数据库的每张表只能有一个主键,... -
数据库中一个表中如何设置两个主键
2014-12-20 21:22:16如何设置多个主键 -
一个表的字段不是主键可以做其他表的外键么
2017-11-20 17:45:47一个表的外键关联到主表的主键约束或者unique约束都可以,不一定非要主键约束追问:也就是意思是只要能唯一标识一张表中数据,就可以做外键?追答:嗯,但是不能是数据上控制的,必须要有两个约束之一才行 -
MySQL表必须有主键吗?
2020-11-04 19:06:27因为聚集索引决定了表中数据的物理存储顺序,那么一个表则有且只有一个聚集索引。一个聚集索引可以包含多个列。好比一个电话本是基于名字,姓氏同时排序。 I nnodb选择一个聚集索引的过程 对于Innodb,主键毫 -
阿里规范中为什么要求表必须有主键id
2021-02-04 17:34:201.创建测试表【user:一个主键:id】 CREATE TABLE `test`.`Untitled` ( `id` int NOT NULL, `name` varchar(255) NULL, PRIMARY KEY (`id`) ); 2.查看索引 show index FROM user Table:表名称 Non_... -
MySQL中主键索引与聚焦索引之概念的学习教程
2020-12-15 07:47:02一个表可以没有主键,但最多只能有一个主键,并且主键值不能包含NULL。 在MySQL中,InnoDB数据表的主键设计我们通常遵循几个原则: 采用一个没有业务用途的自增属性列作为主键; 主键字段值总是不更新,只有新增或者... -
数据库中如何在同一张表中,复制已经存在的记录,只有主键不同,其余字段均相同,不变
2018-12-20 10:02:39FAS_BILL_INFO表的主键为BILL_CODE,新生成一个new_bill_code,把old_bill_code对应的全部复制到新生成new_bill_code的记录中; declare old_bill_code varchar2(44); --旧借据号 旧主键 new_bill_code varchar... -
MySQL中什么是数据表的复合主键
2021-01-18 19:03:58MySQL中什么是数据表的复合主键发布时间:2020-11-23 14:03:11来源:亿速云阅读:108作者:小新这篇文章主要介绍MySQL中什么是数据表的复合主键,文中介绍的...所谓的复合主键,就是指你表的主键含有一个以上的字... -
数据库表的主键、唯一约束和索引
2021-11-23 17:31:461、MySQL 的 主键。...(2)主键值必须唯一标识表中的每一行,且不能为 NULL,即同一个表中不可能存在两行数据有相同的主键值。 2、MySQL 的 唯一约束。 MySQL唯一约束(Unique Key)是指所有记录中字 -
如何使用sqlalchemy获取表的主键、以及每一个字段名
2019-09-22 19:30:50使用sqlalchemy获取到的结果只包含...以及如何获取某张表的主键呢? from sqlalchemy.ext.automap import automap_base from sqlalchemy.orm import sessionmaker from sqlalchemy import MetaData, inspect, creat... -
C# 两个不相同结构的datatable中的数据只有一个主键一样如何快速比较返回差集
2017-06-26 06:03:00现在有2个表部分学校表和学校表 其中部分学校表在A库、学校表在B库 SCH_ID为关联主键 部分学校表 AUTO_ID USER_ID COTY_NO SCH_ID SCH_NO SCH_NAME 1 17 123 341289001 1 职业学院 学校表 SCH_ID SCH_NO SCH_... -
mysql设置主键有什么用
2021-01-19 06:36:18【相关学习推荐:mysql教程】mysql设置主键的作用是:1、什么是主键数据库主键,指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表的实体完整性。主键主要是用于其他表的外键关联,以及本... -
MySQL为什么需要一个主键
2017-08-18 11:31:45注:创建一个表,创建主键是个良好的习惯或应当作为规范,若预测可能累计大量数据,必须必须必须设置主键,并且应当选择合适的主键,否则你会...表中每一行都应该有可以唯一标识自己的一列(或一组列)。 一个顾客可以 -
主键 外键 索引 为什么主键只有一个 主键与索引是什么关系
2011-06-13 11:04:00因为主键起始从实现角度来看是一个 唯一 非空 聚类索引, 聚类索引在一个表中只有一个,所以主键只有一个。至于为什么聚类索引在一个表中只有一个是因为聚类索引表的数据物理顺序和索引排序方式一致,而物理存储... -
sqlserver设置两个及两个以上主键
2018-10-14 17:34:13首先要明确主键只有一个,但是我们可以设置主键组来设置主键。这样两个列就都是主键了。设置方法: 利用图形界面操作 选中方法。按住shift,再点击你要选中的列就ok了。 利用SQL语句 alter table tablename ... -
SQL--当一张表的两个外键指向同一主键
2017-11-26 18:54:54最近遇到了这样一个问题,当一张表中有两个外键同时执行了另外一种表的主键,如何建立一张视图,让这两个外键都找到相应的信息。来实例吧:第一张表,归还记录:第二张表,用户表:问题就是,归还记录表里有两个字段,...