精华内容
下载资源
问答
  • 数据库 主键 外键 唯一键区别

    千次阅读 2018-11-13 19:57:15
    下面我通过一个小栗子来说明我们应该如何选择主键,外键和唯一键。 现在我们想建立学生表,用来存储,一个系统的登陆信息。建表如下: create table student4 ( stu_id int primary key identity,--identity表示...

    下面我通过一个小栗子来说明我们应该如何选择主键,外键和唯一键。 
    现在我们想建立学生表,用来存储,一个系统的登陆信息。建表如下:

    create table student4
    (
      stu_id int primary key identity,--identity表示自增
      stu_name nvarchar(10) unique not null,
      stu_sex nchar(1) not null,
      stu_address nvarchar(100) unique not null,
      stu_email nvarchar(50)
     )
    我们要求,以后再使用的过程,我们要让大家使用邮箱注册,并通过邮箱来登陆。

    主键:
    根据上面的需求,我们先说主键的选择。 
    相信大家一看,我们可以使用邮箱登陆,那么邮箱一定是唯一的,那么用邮箱来做主键吧。其实不然,用邮箱做主键还是有问题滴。问题有如下四点。 
    1、比如,我后期换邮箱呢,那不就惨了吗。 
    2、如果其他的表已经关联的本学生表的主键——邮箱,那么在我们更换邮箱后,如果不修改其他表中的外键,那么就会报错。如果要是修改的话,可能工作量将会非常的大。 
    3、另外,在查询邮箱的的时候,搜索速度非常的慢。 
    4、如果多个表外键利用学生表的主键,那么就会导致空间的浪费 
    为此,最好增加一个没有意义的编号为主键,不要 以业务逻辑的字段为主键,,比如,设置一个stu_id ,而不能以邮箱字段为主键

    外键:
    其他表,如果需要关联学生表,那需要在表中添加外键来关联学生表,那我们首先的是使用学生表中的主键,万不得已在选择唯一键。

    唯一键
    刚才我们在需求中说了,我们要用邮箱来注册和登陆,那么肯定需要让邮箱不能重复,并且,我们的邮箱又不是主键,那我们只能将邮箱设置为唯一键了。这样就能满足我们的需求了
    总的来说,主键唯一标示表中的每一条记录,外键是主键的副本,从父表中复制出来的,用于建立父表和子表之间的关系,唯一键 确保表中某一个值得唯一性。主键保证了数据的唯一性,外键保证了数据的完整性。
    主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
    外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。
     

    展开全文
  • 数据库主键唯一键、范式

    千次阅读 2015-07-29 11:36:14
    一个主键唯一识别一个表的每一记录,但这只是其作用的一部分,主键的主要作用是将记录存放在其他表中的数据进行关联。在这一点上,主键是不同表中各记录之间的简单指针。主键约束就是确定表中的每一条记录。主键...

    主键:
    能够唯一表示数据表中的每个记录的【字段】或者【字段】的组合就称为主码(主键)。一个主键是唯一识别一个表的每一记录,但这只是其作用的一部分,主键的主要作用是将记录和存放在其他表中的数据进行关联。在这一点上,主键是不同表中各记录之间的简单指针。主键约束就是确定表中的每一条记录。主键不能是空值。唯一约束是用于指定一个或多个列的组合值具有唯一性,以防止在列中输入重复的值。所以,主键的值对用户而言是没有什么意义,并且和它要赋予的值也没有什么特别的联系。

    外键:
    若有两个表A,B,C是A的主键,而B中也有C字段,则C就是表B的外键。外键约束主要用来维护两个表之间数据的一致性。

    主键是唯一的不能重复,非空的。

    唯一键可以为空,但不可以重复。


    第一范式(1NF)

    数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。
    首先我们确定一下要设计的内容包括那些。学号、学生姓名、年龄、性别、课程名称、课程学分、系别、学科成绩,系办地址、系办电话等信息。为了简单我们暂时只考虑这些字段信息。我们对于这些信息,所关心的问题有如下几个方面。
    学生有那些基本信息
    学生选了那些课,成绩是什么?
    每个课的学分是多少
    学生属于那个系,系的基本信息是什么。

    第二范式(2NF)

    首先我们考虑,把所有这些信息放到一个表中(学号,学生姓名、年龄、性别、课程、课程学分、系别、学科成绩,系办地址、系办电话)下面存在如下的依赖关系。
    (学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
    问题分析
    因此不满足第二范式的要求,会产生如下问题
    数据冗余:同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
    更新异常:
    1)若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。
    2)假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。
    删除异常 :假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。
    解决方案
    把选课关系表SelectCourse改为如下三个表:
    学生:Student(学号,姓名,年龄,性别,系别,系办地址、系办电话);
    课程:Course(课程名称,学分);
    选课关系:SelectCourse(学号,课程名称,成绩)。

    第三范式(3NF)

    接着看上面的学生表Student(学号,姓名,年龄,性别,系别,系办地址、系办电话),关键字为单一关键字"学号",因为存在如下决定关系:
    (学号)→ (姓名,年龄,性别,系别,系办地址、系办电话
    但是还存在下面的决定关系
    (学号) → (系别)→(系办地点,系办电话)
    即存在非关键字段"系办地点"、"系办电话"对关键字段"学号"的传递函数依赖。
    它也会存在数据冗余、更新异常、插入异常和删除异常的情况。(数据的更新,删除异常这里就不分析了,可以参照2.1.1进行分析)
    根据第三范式把学生关系表分为如下两个表就可以满足第三范式了:
    学生:(学号,姓名,年龄,性别,系别);
    系别:(系别,系办地址、系办电话)。
    上面的数据库表就是符合I,Ⅱ,Ⅲ范式的,消除了数据冗余、更新异常、插入异常和删除异常。


    1NF:字段不可分;
    2NF:有主键,非主键字段依赖主键;
    3NF:非主键字段不能相互依赖;

    解释:
    1NF:原子性 字段不可再分,否则就不是关系数据库;
    2NF:唯一性 一个表只说明一个事物;
    3NF:每列都与主键有直接关系,不存在传递依赖;

    不符合第一范式的例子(关系数据库中create不出这样的表):

    表:字段1, 字段2(字段2.1, 字段2.2), 字段3 ......

    存在的问题: 因为设计不出这样的表, 所以没有问题;

    不符合第二范式的例子:

    表:学号, 姓名, 年龄, 课程名称, 成绩, 学分;

    这个表明显说明了两个事务:学生信息, 课程信息;

    存在问题:

    数据冗余,每条记录都含有相同信息;
    删除异常:删除所有学生成绩,就把课程信息全删除了;
    插入异常:学生未选课,无法记录进数据库;
    更新异常:调整课程学分,所有行都调整。

    修正:

    学生:Student(学号, 姓名, 年龄);

    课程:Course(课程名称, 学分);

    选课关系:SelectCourse(学号, 课程名称, 成绩)。

    满足第2范式只消除了插入异常。


    不符合第三范式的例子:

    学号, 姓名, 年龄, 所在学院, 学院联系电话,关键字为单一关键字"学号";

    存在依赖传递: (学号) → (所在学院) → (学院地点, 学院电话)

    存在问题:

    数据冗余:有重复值;

    更新异常:有重复的冗余信息,修改时需要同时修改多条记录,否则会出现数据不一致的情况

    删除异常

    修正:
    学生:(学号, 姓名, 年龄, 所在学院);
    学院:(学院, 地点, 电话)。
    作者:sunxing007

    展开全文
  • 主键 一张表里面只能有一个主键,而且主键是不能为null 的 唯一键 一张表里面可以有多个唯一键,唯一键可以为Null,唯一键也保证了该字段的唯一性,可以插入多个null 值
    • 主键 一张表里面只能有一个主键,而且主键是不能为null 的
    • 唯一键 一张表里面可以有多个唯一键,唯一键可以为Null,唯一键也保证了该字段的唯一性,可以插入多个null 值
    展开全文
  • 数据库主键、外键和唯一键的区别 现在我们想建立学生表,用来存储,一个系统的登陆信息。建表如下: create table student4 ( stu_id int primary key identity,--identity表示自增 stu_name nvarchar(10) unique ...

    数据库主键、外键和唯一键的区别

    现在我们想建立学生表,用来存储,一个系统的登陆信息。建表如下:

    create table student4
    (
      stu_id int primary key identity,--identity表示自增
      stu_name nvarchar(10) unique not null,
      stu_sex nchar(1) not null,
      stu_address nvarchar(100) unique not null,
      stu_email nvarchar(50)
     )
    

    我们要求,以后再使用的过程,我们要让大家使用邮箱注册,并通过邮箱来登陆。

    主键

    根据上面的需求,我们先说主键的选择。
    相信大家一看,我们可以使用邮箱登陆,那么邮箱一定是唯一的,那么用邮箱来做主键吧。其实不然,用邮箱做主键还是有问题滴。问题有如下四点。
    1、比如,我后期换邮箱呢,那不就惨了吗。
    2、如果其他的表已经关联的本学生表的主键——邮箱,那么在我们更换邮箱后,如果不修改其他表中的外键,那么就会报错。如果要是修改的话,可能工作量将会非常的大。
    3、另外,在查询邮箱的的时候,搜索速度非常的慢。
    4、如果多个表外键利用学生表的主键,那么就会导致空间的浪费。
    为此,最好增加一个没有意义的编号为主键,不要 以业务逻辑的字段为主键,,比如,设置一个stu_id ,而不能以邮箱字段为主键。

    外键

    其他表,如果需要关联学生表,那需要在表中添加外键来关联学生表,那我们首先的是使用学生表中的主键,万不得已在选择唯一键。

    唯一键

    刚才我们在需求中说了,我们要用邮箱来注册和登陆,那么肯定需要让邮箱不能重复,并且,我们的邮箱又不是主键,那我们只能将邮箱设置为唯一键了。这样就能满足我们的需求了
    总的来说,主键唯一标示表中的每一条记录,外键是主键的副本,从父表中复制出来的,用于建立父表和子表之间的关系,唯一键确保表中某一个值得唯一性。主键保证了数据的唯一性,外键保证了数据的完整性。
    主键是能确定一条记录的唯一标识,比如,一条记录包括身份证号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
    外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。

    展开全文
  • 主键和唯一键的对比: 约束 保证唯一性 是否为空 一个表中有多少个 是否允许组合 主键 是 否 至多一个 是(但不推荐) 唯一键 是 是 可以为多个 是(但不推荐) ...
  • 数据库 主键与索引的区别

    千次阅读 2013-05-29 14:03:40
    关系数据库依赖于主键,它是数据库物理模式的基石。主键在物理层面上只有...下面是主键和索引的一些区别与联系。 1. 主键一定是唯一性索引,唯一性索引并不一定就是主键。 所谓主键就是能够唯一标识表中某一行的属
  • 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如: 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键 ...
  • 数据库主键和唯一索引的区别?

    千次阅读 2018-07-28 16:51:33
    1.主键为一种约束,唯一索引为一种索引,本质上就不同。 2.主键在表中只能有一个,唯一索引可以有多个。 3.主键创建后一定包含唯一性索引...6.主键和索引都是,主键是逻辑,索引为物理,即主键不实际存在。...
  • mysql数据库表的主键、外键、唯一键主键索引、唯一索引、普通索引:
  • 唯一键键约束和唯一索引功能是一样的: "唯一性" + "索引" 唯一键键约束 只是作为一种独特的约束(如主键约束,唯一键约束,check约束,外键约束 的一种),以约束的形式管理.但是同时又自动创建了唯一非聚集索引,也就...
  • 从建表语句可以看出,主键‘id’(PRIMARYKEY('id'))和唯一索引'id'( UNIQUE KEY 'sys_district_id' ('id') )重复了。 来自 “ ITPUB博客 ” ,链接:...
  • Oracle主键唯一键与唯一索引的区别   一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同...接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别。 伦理片 http://www.dotdy.
  • 一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。...接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别。 SQL> select * from v$version; BANNER ----...
  • 创建、删除唯一约束: db2 "alter table tabname add unique(colname)" db2 "alter table tabname drop unique CONSTNAME " 创建主键约束: db2 "alter table staff add primary key (id)" db2 "alter table ...
  • 主键唯一标示表中的每一条记录,外键是主键的副本,从父表中复制出来的,用于建立父表子表之间的关系,唯一键 确保表中谋值得唯一性。
  • Oracle主键约束、唯一键约束、唯一索引的区别 一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的...接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别。 SQL> select * from
  • 数据库主键的设计

    2016-07-18 09:41:22
    而对于一个表,由两部分组成:主键和属性。主键的简单定义就是表中为每一行数据的唯一标识。其实更准确的说法,每一行数据的唯一标识是候选(Candidate Key),一个表中可以有很多个候选,主键是候选中的一个...
  • 一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。...接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别。 SQL> select * from v$version; BANNER -------------
  • 简要地说,主键和唯一索引,或者和索引之间的最主要区别在于:是一个逻辑层面的概念,涉及到数据模式的设计。从语法角度看,被定义为一种约束。比方说,如果想定义外键(或称参考约束),那么相关列就必须先...
  • 表的约束空属性及非空属性默认值列描述zerofill主键自增长索引唯一键外键 表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primary key,auto_increment,unique key 。 空属性...
  • 数据库主键和外键

    千次阅读 2019-07-03 15:49:56
    数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。一个表只能有一个PRIMARY KEY约束,而且PRIMARY KEY约束中的列不能接受空值。 ...
  • 一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。...接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别。 SQL>select * from v$version;   BANNER -----------

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 856
精华内容 342
关键字:

数据库主键和唯一键