精华内容
下载资源
问答
  • 一个(关系)"超级键"是每组在中具有唯一子行的列集。 (请注意,超级密钥的每个超集也是一个超级密钥。)(简单的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,其行的含义仍然是根据保存这些列的表的含义。因此,查询,更新或约束可以再次涉及核心业务实体,而不存在其指定的主键列。并且它可以涉及没有关联的基本主键列的派生实体。因此声称主键是必需的或基本的或唯一识别是没有根据的。

    展开全文
  • 重要的是,每实体的逻辑模型至少具有组“业务属性”,其包括实体的密钥。 Boyce,Codd,Date等在关系模型中将这些称为候选键。 然后,当我们为这些实体构建时,它们的候选键在这些中成为自然键。 只有通过...

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

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

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

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

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

    如果由于业务限制必须使用GUID,那么搜索更好的群集密钥是值得的。 例如,如果一个小的站点标识符和4字节的“站点序列号”是可行的,那么该设计可能比作为代理键的GUID具有更好的性能。

    如果堆的结果(可能是散列连接)使得该首选存储成为更广泛的集群密钥的成本,则需要将其平衡到权衡分析中。

    考虑这个例子::

    ALTER TABLE Persons

    ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)

    其中元组“(P_Id,LastName)”需要唯一性约束,并且可能是冗长的Unicode LastName加上4字节整数,因此需要(1)声明性地将此约束强制实施为“ADD CONSTRAINT pk_PersonID UNIQUE NONCLUSTERED(P_Id) ,LastName)“和(2)分别声明一个小的代理键作为聚簇索引的”主键“。 值得注意的是,Anita可能只希望将LastName添加到此约束中以使其成为覆盖字段,这在聚簇索引中是不必要的,因为所有字段都被它覆盖。

    SQL Server将主键指定为非聚簇的能力是一个不幸的历史情况,因为“首选自然或候选键”(来自逻辑模型)与“物理存储中的查找键”的含义相混淆 模型。 我的理解是,最初SYBASE SQL Server总是使用4字节的RowID,无论是作为堆还是聚簇索引,作为物理模型中的“存储中的查找键”。

    展开全文
  • 什么是一个表的外键 他和主键有什么区别吗/?主键:唯一标识表中的所有行的一个列或一组列。主键不允许空值。不能存在具有相同的主键值的两个行,因此主键值总是唯一标识单个行。表中可以有不止一个键唯一标识...

    什么是一个表的外键 他和主键有什么区别吗/?主键:唯一标识表中的所有行的一个列或一组列。主键不允许空值。不能存在具有相同的主键值的两个行,因此主键值总是唯一标识单个行。表中可以有不止一个键唯一标识行,每个键都称作候选键。只有一个候选键可以选作表的主键,所有其它候选键称作备用键。尽管表不要求具有主键,但定义主键是很好的做法。 在规范化的表中,每行中的所有数据值都完全依赖于主键。例如,在以 EmployeeID 作为主键的规范化的 employee 表中,所有列都应包含与某个特定职员相关的数据。该表不具有 DepartmentName 列,因为部门的名称依赖于部门 ID,而不是职员 ID。 外键:外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。 Create database cat go use cat go CREATE TABLE s(s# int not null primary key,s_name varchar(8) not null) go CREATE TABLE c (c# int not null primary key,c_name varchar(8) not null) go CREATE TABLE cs(c# int not null,s# int not null,cj tinyint not null default(0), primary key (c#,s#),foreign key(s#) references s(s#),foreign key(c#) references c(c#)) go insert s values(1,’saa’) insert c values(1,’caa’) --这句是对的 insert cs values(1,1,86) --这句是错的,sql会报错,应为s表的s#列里没有2 insert cs vlaues(2,1,45) 定义主键来强制不允许空值的指定列中输入值的唯一性。如果在数据库中为表定义了主键,则可将该表与其它表相关,从而减少冗余数据。表只能有一个主键。 外键。 当创建或更改表时可通过定义 FOREIGN KEY 约束来创建外键。 例如,数据库 pubs 中的 titles 表与 publishers 表有链接,因为在书名和出版商之间存在逻辑联系。titles 表中的 pub_id 列与 publishers 表中的主键列相对应。titles 表中的 pub_id 列是到 publishers 表的外键。 FOREIGN KEY 约束并不仅仅只可以与另一表的 PRIMARY KEY 约束相链接,它还可以定义为引用另一表的 UNIQUE 约束。FOREIGN KEY 约束不允许空值,但是,如果任何组合 FOREIGN KEY 约束的列包含空值,则将跳过 FOREIGN KEY 约束的校验。 主键是本表的唯一标识,而外键是与另一个表相关联 

    展开全文
  • 因为聚集索引决定了表中数据的物理存储顺序,那么一个表则有且只有一个聚集索引。一个聚集索引可以包含多个列。好比一个电话本是基于名字,姓氏同时排序。 I nnodb选择一个聚集索引的过程 对于Innodb,主键

    前言:

    一般情况下,我们所使用的储存引擎是innodb,那今天我就基于存储引擎是innodb的情况来讨论下表是否必须有主键

    聚簇索引

    提到innodb就先介绍下聚簇索引的概念,聚集索引定义了表中数据的物理存储顺序。如何理解聚集索引呢,好比一个电话本,比如一个电话本是按照姓氏排序,并且电话号码紧跟着后面。因为聚集索引决定了表中数据的物理存储顺序,那么一个表则有且只有一个聚集索引。一个聚集索引可以包含多个列。好比一个电话本是基于名字,姓氏同时排序。

    I

    nnodb选择一个聚集索引的过程

    对于Innodb,主键毫无疑问是一个聚集索引。但是当一个表没有主键,或者没有一个索引,Innodb会如何处理呢。请看如下规则

    如果一个主键被定义了,那么这个主键就是作为聚集索引

    如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引

    如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增。

    总结:

    在MySQL中,InnoDB存储引擎总是在没有显式指定的情况下创建主键,从而生成一个额外的列,您无法访问它。所以最好的情况下还是为innodb为存储引擎的数据表指定主键比较好

    展开全文
  • 文章正文:MySQL的主键可以是自增的,那么如果在断电重启后新增的值还会...2、如果是 InnoDB引擎,1)在 5.6之前是存储在内存中,没有持久化,在重启后会去找最大的键值,举个例子,如果一个表当前数据行里最大 id是...
  • 因为这是SQLServer的默认主键行为,你设置了主键,它就把主键设为聚簇索引,而一个表最多只能有一个聚簇索引,所以很多人就把其他索引设置为非聚簇索引。这个是最大的误区。甚至有的主键又是无意义的自动增量字段,...
  • 它以READ_COMMITTED模式运行,只有一个表,它具有非重叠的主键和唯一键:CREATE TABLE test3(p BIGINT NOT NULL,u BIGINT NOT NULL,PRIMARY KEY (p),UNIQUE KEY(u));INSERT INTO test3 VALUES(10, 10);有两个事务正在...
  • 一个基础问题

    2010-10-10 14:54:00
    用sql server设计了一个表,其中有一个人的身份证的信息,我想以身份证号为主键,可以吗? 可是网上看到的资料说,主键不应该人为给定的,应该由计算机自动生成,貌似就是自增的意思。 可以用身份证...
  • 本次,我们来看看索引、提交频率对InnoDB写入速度的影响,了解有哪些需要注意的。先直接说几个结论吧:1、...因此,InnoDB最好总是有一个自增列做主键。2、关于提交频率对写入速度的影响(以只有自增列做主...
  • 如何才能联合好几张进行查询呢~ 我们应该学会用JOIN来合并我们的。 但是,是说合并就能合并的吗~ NONONO~ 之间其实也有人际关系的~ 怎么说呢,如果,之间没有...第一个JOIN:INNER JOIN INNE
  • 只有一个候选键可以选作主键,所有其它候选键称作备用键。尽管不要求具有主键,但定义主键是很好的做法。 在规范化的中,每行中的所有数据值都完全依赖于主键。例如,在以 employeeid 作为主...
  • /* 以layui格式创建函数,暂时只有一个函数:mySearchTableReload */ active = { //定义搜索按钮函数 mySearchTableReload : function() { table.reload('myTableReloadId', { page:{ curr:1 }, ...
  • 这样类型可以只有几条分类数据,有几种分类就有几条记录, 可是他竟然把所有店面ID丢到了店面类型表里, 这就代表着,商品有多少记录,分类就也有多少记录。。 大概长这样: 店面(店面ID,...
  • 还有一个问题,就是我通过注解设置的主键生成策略是auto类型的话,自己不能定义主键值吗?举个例子,现在有个tab_teacher,它有2个字段,分别是teacher_id和teacher_name,现在我用persist(new Teacher(1,"王老师...
  • 场景业务中有一个日志,插入数据与同步数据查询强依赖于主键的有序性数据同步时携带上次同步更新的主键,查询到Max(id)之间的数据,只同步增量部分意味数据只有一次同步机会结构如下问题Mysql 数据隔离级别是RR...
  • PRIMARY KEY主键索引不允许出现相同的值,且不能为NULL值,一个表只能有一个primary_key索引。fulltext index 全文索引上述三种索引都是针对列的值发挥作用,但全文索引,可以针对值中的某个单词,比如一篇文章中的...
  • 从《mysql存储引擎InnoDB详解,从底层看清InnoDB数据结构》中,我们已经知道了数据页内各个记录是按主键正序排列并组成了一个单向链表的,并且各个数据页之间形成了双向链表。在数据页内,通过页目录,根据主键可以...
  • 引言上一篇我们说到了Laravel中是有两种集合,一个是 BaseCollection,一个是 EloquentCollection。后者继承前者,而且对部分方法进行了重载。分清楚之间的细微区别,可以让你在编程中不...只有3列,一个主键,...
  • 引言上一篇我们说到了Laravel中是有两种集合,一个是 BaseCollection,一个是 EloquentCollection。后者继承前者,而且对部分方法进行了重载。分清楚之间的细微区别,可以让你在编程中不...只有3列,一个主键,...
  • 引言上一篇我们说到了Laravel中是有两种集合,一个是 BaseCollection,一个是 EloquentCollection。后者继承前者,而且对部分方法进行了重载。分清楚之间的细微区别,可以让你在编程中不...只有3列,一个主键,...
  • 那么在这种情况下如何使DB里面最终只有一条记录? 公司的做法是: <pre name="code" class="java"> public synchronized A save(A a){ //查找数据库看有没有a if(没有记录){ //锁 //...
  • 先来看一个实际例子,我们创建一个新只有一个主键 id 和一个 length 字段,其中 length 字段设置为 int(5) 。#新建test CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMEN...
  • 先来看一个实际例子,我们创建一个新只有一个主键 id 和一个 length 字段,其中 length 字段设置为 int(5) 。 #新建test CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREM...
  • 一般情况下,只有一个字段可以添加主键,此字段一般是编号 2.域完整性 一般是对一个字段的约束 例如:学号 位数一般是确定的,可以用数据类型约束 char(10) 3.引用完整性 一般指的是多张表...
  • 2020-09-08

    2020-09-08 18:13:35
    索引表可以和内容表合并成一个表吗? 这里需要考虑一个问题,我们在查询两个人之间的历史消息的时候是用户维度的查询还是消息维度的查询?如果按消息id哈希,查询两个人之间的历史消息在只有uid的情况下该怎么查呢...
  • DataTable因使用灵活,所以在有不少开发者喜欢使用。但是你真的会用吗? 我用DataTable来处理数据有很久了,但是一直没有仔细研究过它,每次处理数据的时候都是使用最笨的方法来循环...(1) 主键只有一个字段 DataRo
  • MySQL大查询的问题

    2021-01-19 20:01:16
    我们经常会遇到这样的问题,我的主机内存只有 100G,现在要对一个 200G 的大做全扫描,会不会把数据库主机的内存用光了?这个问题确实值得担心,被系统 OOM(out of memory)可不是闹着玩的。 但是,反过来想想...
  • count(*)优化

    2020-11-21 16:18:04
    序言 谈到mysql优化,肯定有很多人会提到count(*)优化,百度到的面试题和各种博客,大堆。count(*),真的需要优化吗,如果需要优化...只有主键索引时 EXPLAIN select count(*) from employees;---->0.58..
  • 2.5.2 某公司申请到一个C类IP地址,但要连接6个的子公司,最大的一个子公司有 26台计算机,每个子公司在一个网段中,则子网掩码应设为? 2.5.3 与10.110.12.29mask 255.255.255.224属于同一网段的主机IP地址是? ...

空空如也

空空如也

1 2
收藏数 36
精华内容 14
关键字:

一个表只有一个主键吗