精华内容
下载资源
问答
  • 关系数据库中,一张表的每一行数据被称为一条记录。一条记录就是由多个字段组成的。例如,students表的两行记录: id class_id name gender score 1 1 小明 M 90 2 1 小红 ...

    在关系数据库中,一张表中的每一行数据被称为一条记录。一条记录就是由多个字段组成的。例如,students表的两行记录:

    id class_id name gender score
    1 1 小明 M 90
    2 1 小红 F 95

    每一条记录都包含若干定义好的字段。同一个表的所有记录都有相同的字段定义。

    对于关系表,有个很重要的约束,就是任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,这个字段被称为主键

    例如,假设我们把name字段作为主键,那么通过名字小明小红就能唯一确定一条记录。但是,这么设定,就没法存储同名的同学了,因为插入相同主键的两条记录是不被允许的。

    对主键的要求,最关键的一点是:记录一旦插入到表中,主键最好不要再修改,因为主键是用来唯一定位记录的,修改了主键,会造成一系列的影响。

    由于主键的作用十分重要,如何选取主键会对业务开发产生重要影响。如果我们以学生的身份证号作为主键,似乎能唯一定位记录。然而,身份证号也是一种业务场景,如果身份证号升位了,或者需要变更,作为主键,不得不修改的时候,就会对业务产生严重影响。

    所以,选取主键的一个基本原则是:不使用任何业务相关的字段作为主键。

    因此,身份证号、手机号、邮箱地址这些看上去可以唯一的字段,均不可用作主键。

    作为主键最好是完全业务无关的字段,我们一般把这个字段命名为id。常见的可作为id字段的类型有:

    1. 自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键;

    2. 全局唯一GUID类型:使用一种全局唯一的字符串作为主键,类似8f55d96b-8acc-4636-8cb8-76bf8abc2f57。GUID算法通过网卡MAC地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的,大部分编程语言都内置了GUID算法,可以自己预算出主键。

    对于大部分应用来说,通常自增类型的主键就能满足需求。我们在students表中定义的主键也是BIGINT NOT NULL AUTO_INCREMENT类型。

     如果使用INT自增类型,那么当一张表的记录数超过2147483647(约21亿)时,会达到上限而出错。使用BIGINT自增类型则可以最多约922亿亿条记录。

    联合主键

    关系数据库实际上还允许通过多个字段唯一标识记录,即两个或更多的字段都设置为主键,这种主键被称为联合主键。

    对于联合主键,允许一列有重复,只要不是所有主键列都重复即可:

    id_num id_type other columns...
    1 A ...
    2 A ...
    2 B ...

    如果我们把上述表的id_numid_type这两列作为联合主键,那么上面的3条记录都是允许的,因为没有两列主键组合起来是相同的。

    没有必要的情况下,我们尽量不使用联合主键,因为它给关系表带来了复杂度的上升。

    小结

    主键是关系表中记录的唯一标识。主键的选取非常重要:主键不要带有业务含义,而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL

    可以使用多个列作为联合主键,但联合主键并不常用。

    展开全文
  • 数据库中主键与外键的理解

    千次阅读 2015-07-19 17:21:12
    数据库中主键与外键的理解    在关系数据库中,数据结构有逻辑结构和物理结构。物理结构存储在物理介质上的数据文件的结构。逻辑结构即关系,也就是一张张的二维表。表的一列即为一个字段(属性),代表的...
    数据库中主键与外键的理解
     
        在关系型数据库中,数据结构有逻辑结构和物理结构。物理结构指存储在物理介质上的数据文件的结构。逻辑结构即关系,也就是一张张的二维表。表中的一列即为一个字段(属性),代表的是实体的一个属性。表中的一行即为一条记录。

        如:学生表中(学号,姓名,年龄,性别),在该表中有4个字段,代表学生实体的4个属性。表中的一行数据(001,张三,男,20),即一条记录,表示的是张三这个学生的信息。
        在表中,用来唯一标识一条记录的字段集,叫做主关键字或者主关键码,简称主键(主码),而主键包含的属性(字段)叫做主属性,其他的则为非主属性。
        在这里说明一下,既然是“字段集”,那么主键就可能是一个字段或者多个字段。例如上面的学生表,学号就是能唯一标识一个学生的字段,学号字段就是该表的主键。由于学生的姓名重名是不可避免的,所以一般不用姓名来作为唯一标识一个学生的主键。
        再举个例子说明一下多个字段作为主键。例如学生选课表(学号,课程号,成绩),在学生选课表中,主关键字是(学号,课程号)。原因显而易见,一个学生可以选择多门课程,一个课程可以被多个学生选择。如果单单是用学号或者课程号,都不足以唯一标识一条记录。
        对于外键的理解,在这里我也举个例子。假设有两个表,学生表(学号,姓名,年龄,性别,专业编号),专业信息表(专业编号,专业名称,专业备注信息)。学生表中主键是学号,专业信息表中主键是专业编号。学生表中的非主属性专业编号恰好是专业信息表中的主键。我们就称这个专业编号是学生表的外键。像这样,一个表的非主属性是另一个表的主属性,该非主属性就是外键。
        

        数据库的约束有三种,实体完整性约束、参照完整性约束和用户自定义约束。


        1.实体完整性约束指的是主键不能为空,如果主键为空了还怎么唯一标识一条记录。
        2.参照完整性约束,即外键的约束,某一外键的值必须在它引用的主键字段中存在。如,学生表中专业编号属性的值,必须都存于专业信息表中的专业编号属性中。想一想也就明白了,一个学生(大学生)怎么可能属于一个不存在的专业。
        3.用户自定义完整性约束,指的是一些用户自己设定的约束,例如字段是否可以为空,字段值的取值范围(如:人的性别只能取男、女)。
    展开全文
  • 主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。 必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是...

    数据库中主键和外键的设计原则

    主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。
    必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。
    主键:
      关系数据库依赖于主键---它是数据库物理模式的基石。主键在物理层面上只有两个用途:
            1. 惟一地标识一行。
     
            2. 作为一个可以被外键有效引用的对象。 http://www.mscto.com
      基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则:
     
            1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。
            2. 主键应该是单列的,以便提高连接和筛选操作的效率。
    软件开发网
     
           注:使用复合键的人通常有两个理由为自己开脱,而这两个理由都是错误的。其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反对这种做法,理由是:复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。
     
            3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。
           注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。
            4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。
            5. 主键应当有计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。
    我认为主键可以分为两种,一种是无意义的主键,例如News表中的NewsID主键,目的只是为了唯一标识一条记录,如果数据表中去掉这个主键字段,该表中的信息也是完整的,也就是说该字段对用户是透明的,用户理不理解都无所谓;一种是有意义的主键,比如Orders表中的OrderNO主键,这个表是离不开OrderNO这个字段的,这个字段已经成为业务实体的一部分了,这在做系统分析的时候就已经确定了,它对用户来说是可理解的,甚至是需要记忆的。 

      有意义的主键是需要自己写程序或者建立专门的数据表来生成的,而且生成的规则也是在系统分析的时候就确定好的;对于无意义的主键则根本没有这个必要,下面我列出了一个流程步骤来说明怎样给数据表分配一个主键: 

      1、数据表一定要有主键,该主键可以是一个或者多个呵呵,废话一句 

      2、数据表的主键选择首先在该数据表自有的字段中找,依据是该字段或者字段组合可以唯一的标识一条记录,好像也是废话 

      3、如果在自有字段中实在找不到可以唯一标识一条记录的字段或者字段组合(例如News表)时,需要给表增加一个主键字段,这个增加的主键是无意义的。 

      4、如果找到一个字段可以唯一的标识一条记录,则该表的主键则为这个字段(例如Orders表),这个主键就是有意义的 

      5、如果找到一个字段组合可以唯一的标识一条记录,则分为以下两种情况 

      6、如果该数据表不需要与其他的表进行数据主-外键关联,则该表的主键则为这个字段组合,这个字段组合的主键也是有意义的 

      7、如果该数据表表需要与其它表产生主-外键关联,这时候也要增加一个主键字段,而把找到的那个字段组合作成唯一索引,原因是多字段主键没法与其它表建立数据关联,这个增加的主键是无意义的。 

      8、无意义的主键类型在自增的int与guid中选择,选择的依据是是否该数据现在或者以后需要进行表分布,需要分布就选择guid,否则就选择自增int,原因是自增的int没法进行表分布

    数据库事务的四种特性

    概念

    事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

    例如:在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。

    特性

      事务是恢复和并发控制的基本单位。

      事务应该具有4个属性:原子性、一致性、隔离性、持续性。这四个属性通常称为ACID特性。

      原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。

      一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

      隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

      持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

    一般的数据库都事务都会满足这四个特点,也有不满足的。

    oracle分页查询的实现

    oracle分页查询主要是用来解决数据表中数据量太大时,资源不够引起的问题。试想如果硬件资源足够多的话,编程是不会考虑硬件的,愿意怎么实现就怎么实现,一次性读出数据来难道不是最简单的办法?然后现实确不允许我们这么做,因为你这么做了程序会报内存溢出的出错,最后还是我们的责任。所以必须得分页。

    来不及整理,转一篇文章当做笔记:

    分页查询格式:

    1. SELECT * FROM   
    2. (  
    3. SELECT A.*, ROWNUM RN   
    4. FROM (SELECT * FROM TABLE_NAME) A   
    5. WHERE ROWNUM <= 40  
    6. )  
    7. WHERE RN >= 21  

    其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。

    上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。

    选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。这是,查询语句如下:

    1. SELECT * FROM   
    2. (  
    3. SELECT A.*, ROWNUM RN   
    4. FROM (SELECT * FROM TABLE_NAME) A   
    5. )  
    6. WHERE RN BETWEEN 21 AND 40  

    对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。

    这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。

    而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。






    展开全文
  • 数据库主键与外键

    2019-01-09 00:44:38
    数据库主键与外键 ...如果用户看到了一个表示多对多关系的连接表的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。 主键应该是单列的,以便提高连接和筛选操作的效率。 主键的作用 (1)索引:...

    数据库的主键与外键

    一、什么是主键(PRIMARY KEY):

    1. 惟一地标识一行。
    2. 作为一个可以被外键有效引用的对象。
      基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则:
      1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。
      2. 主键应该是单列的,以便提高连接和筛选操作的效率。
        主键的作用
        (1)索引:优化查询速度
        (2)数据表之间的关联引用关系是依赖具体的主键(primary key)和外键(foreign key)建立起来的。
        (3)主键:帮助MySQL以最快的速度把一条特点的数据记录的位置确定下来
        注意:主键必须是唯一的
        主键应该是紧凑的,因此整数类型比较适合。

    下面是主键的例子:

    CREATE TABLE student(
        sid INT NOT NULL auto_increment PRIMARY KEY,
        name VARCHAR(20) NOT NULL
    )
    

    二、什么是外键(FOREIGN KEY REFERENCES):

    外键:外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。
    注意:外键列类型尽可能与主键列类型保持一致外键列应该加上NOT NULL。

    删除的时候一定要先外键表(user),再删除主键表(message)
    添加数据则相反,先添加主键表,再添加外键表。(或者是外键表的数据添加主键表中有的id)

    1.创建完表之后再创建外键的方法:
    格式:ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(外键) REFERENCES 另一个表名(参考主键);
      
    2.下面是外键的例子:

    CREATE TABLE score(
        cid INT NOT NULL auto_increment PRIMARY KEY,
        score INT,
        sid INT,
        FOREIGN KEY(sid)REFERENCES student(sid)
    );
    

    三,主键和外键的区别

    主键 外键
    定义 : 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值
    作用 : 用来保证数据完整性 用来和其他表建立联系用的
    个数 : 主键只能有一个 一个表可以有多个外键

    四,主键和外键所起约束作用:
    (1)插入非空值时,如果主键表中没有这个值,则不能插入。
    (2)更新时,不能改为主键表中没有的值。
    (3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。
    (4)更新主键记录时,同样有级联更新和拒绝执行的选择。
    五,主键与外键的联系
    1.外键是指一个属性在当前的关系表里不是主键,而这个属性却是另一个表的主键。而且通过外键可以将两个表联系起来。
    2.实例:
    比如学生关系表,‘系别’不是主键,而如果存在这样一个系关系表(系别,系主任),在这里‘系别’是主键,它能够唯一标识这个表,我们就可以称‘系别’是学生关系表的外键。而在数据库中如果要查询一个学生所在系的系主任的名字,就通过外键‘系别’将两个表之间建立关系查询就可以了。

    展开全文
  • 数据库主键和外键

    千次阅读 2019-07-03 15:49:56
    数据库主键表中一个列或列的组合,其值能唯一地标识表的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。一个表只能有一个PRIMARY KEY约束,而且PRIMARY KEY约束的列不能接受空值。 ...
  • 关系数据库中的一条记录有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如 : 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,...
  • 数据库中删除表中主键约束时出现错误的原因及解决方法 #问题描述: 今天在对MYSQL数据库进行基本操作——删除表主键约束时发现不能删除表主键约束: 下面是三张表之间的关系: 原因 个人理解外键约束是表...
  • 外键(FOREIGN KEY):如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的...
  • 主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。 索引:  是用来快速地寻找那些具有特定值的记录。主要是为了检索的方便,是为了加快访问速度, ...
  • 关系数据库与非关系数据库的区别

    万次阅读 2018-11-01 20:50:59
    当前主流的关系数据库有Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等。 非关系数据库有 NoSql、Cloudant。 nosql和关系数据库比较? 优点: 1)成本:nosql数据库简单易部署,基本都是开源...
  • 数据库通常分为层次式数据库、网络式数据库关系数据库三种。而不同的数据库是按不同的数据结构来联系和组织的。  1.数据结构模型  (1)数据结构  所谓数据结构是数据的组织形式或数据之间的联系。...
  • 数据库设计逻辑主键

    千次阅读 2009-03-27 17:03:00
    数据库设计我们经常会存在是否为表建立逻辑主键(代理主键)的问题。 使用逻辑主键的好处: 1.业务系统需要关联时使用逻辑ID进行关联--而不是有业务ID做关联--使业务系统具有最大的灵活性,及业务ID也是...
  • 关系数据库系统

    2018-11-17 16:30:30
    关系数据库系统概述 关系数据库系统的发展历史 关系数据模型 数据模型 = 数据结构 + 数据操作 + 完整性约束 数据结构(层次,网状,关系,对象) 数据操作(DDL,DML) 完整性约束(实体完整性/主键存在,参照...
  • 关系数据库采用了关系模型来组织数据的数据库关系模型的就是二维表格模型,而一个关系数据库就是由二维表及其之间的联系所组成的一个数据组织。 关系模型常用的概念: 关系:一张二维表,每个关系...
  • SQL SERVER 数据库主键和外键的思考

    千次阅读 2013-10-14 23:12:54
    SQL SERVER 数据库主键和外键的思考 什么是主键: 主键是表中一个列或者列的组合,其值能够唯一的标识表的每一个行。这样的一列或者多列成为表的主键,通过它可以强制表的实体完整性。当创建或者更改表时...
  • 关系数据库与非关系数据库详细比较

    千次阅读 多人点赞 2018-11-12 11:06:02
    2.非关系数据库通常数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定。 3.非关系数据库中,我们查询一条数据,结果出来一个数组,关系数据库中,查询一条数据结果是...
  • 目录 关系数据库 关系数据库关系模型的常用概念 优点 ...非关系数据库 ...非关系数据库: ...关系模型的就是二维表格模型,而一个关系数据库就是由二维表及其之间的联系所组成的一个数据组织。...
  •  在我们的数据库设计数据库主键是必不可少的,主键的设计对整个数据库的设计影响很大.我就对自动增量字段与Guid字段的性能作一下对比,欢迎大家讨论. 2.简介:  1.自增量字段  自增量字段每次都会按...
  • 关于数据库主键与外键

    千次阅读 2010-09-09 10:41:00
    客户名称 b表存有每个客户的订单 有了外键后 你只能在确信b 表没有客户x的订单后,才可以在a表删除客户x 建立外键的前提:本表的列必须与外键类型相同(外键必须是外表主键)。 指定...
  • 关系数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库的数据。简单说,关系型数据库是由多张能互相联接的二维行列表格组成的数据库。 关系模型就是二维表格模型,因而一个...
  • 如果由两个列共同组成主键,而且一个子表将主键作为可为空值的外键来继承,就可能得到错误的数据。可在一个外键列插入有效的值,但在另一个外键列插入空值。然后,可添加一个数据表检查约束,在可为空的外键...
  • 关系数据库与非关系数据库Nosql区别汇总

    千次阅读 多人点赞 2018-08-24 11:14:06
    目录 关系数据库与非关系数据库详细比较 关系数据库与非关系数据库优缺点对比 关于Nosql ...2.非关系数据库通常数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的...
  • 文章目录关系数据库关系操作基本关系操作关系数据库语言的分类关系模型的完整性实体完整性(Entity Integrity)参照完整性(Referential Integrity)用户定义完整性(User-defined Integrity)E-R图向关系模型的转换...
  • 数据库系统原理 - - (2)关系数据库

    千次阅读 多人点赞 2020-09-27 09:19:45
    文章目录二:关系数据库1.关系数据库概述a.关系数据库的产生历史b.关系数据模型的组成要素2.关系数据模型a.表(Table)b.关系(Relation)c.列(Column)d.行(Row)e.码或键(Key)f.超码或超键(Super Key)g.候选码...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 67,476
精华内容 26,990
关键字:

关系数据库中的主键是指