乘风原创程序

  • SQLServer学习笔记 - 主键的理解
  • 2020/10/8 14:04:19

  • 最近在学习SQLServer时,发现里面有个主键的概念和作用总是模糊不清,因此上网去搜索了一些主键的一些意义,加深一下理解

    什么是主键

    按照百度百科的定义,主键(primary key)是数据表中的一个或多个字段,其值用于唯一的标识表中的某一条记录;在两个表的关系中,主关键字用来在一个表中引用来自于另一个表的特定记录;
    (这段话有点抽象,看完了和没看区别不大,且看下面的讲解)

    建立主键遵循的原则

    (1)主键应当是对用户没有意义的,当用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那么证明表的主键设计很好;
    (2)永远不要更新主键,因此主键除了唯一的标识一行之外,没有其他用处,如果需要更新,那么主键对于用户无意义的原则被违反了
    :这项原则在对于哪些经常需要在数据转换或者多数据合并时进行数据整理的数据并不适用
    (3)主键不应该包含动态变化的数据,如时间戳、时间列等
    (4)主键应当由计算机自动生成

    主键的特点

    (1)一个表中只能有一个主键,如果在其他字段上建立主键,则原来的主键就会取消
    (2)主键的值不可以重复,也不可以为空

    真正的主键理解

    说了前面这么多概念,现在以一个实际例子来说明主键
    假设想建立一个学生信息表,包含信息如下:

    create table StudentInfo
    (
    	StudentId int prinamry key identity, -- 主键
    	StudentName varchar(20)  not null, -- 唯一键
    	StudentGender char(2) not null,
    	StudentAddress varchar(500) not null,
    	StudentAccount varchar(100) unique
    )
    

    要求学生在使用学生登录系统时采用账户进行登录;
    那么如何去选择主键呢?
    可能从名字上来说,主键会被认为是十分重要的键,因此可能会说采用账户来做主键,这样显得有足够的重要性;但是其实不然,从主键的选择原则来看,主键就是需要选择没有太多意义且不会被改变的数据,而对于大部分来说,账户其实是可以进行更改的,那么用账户来做主键就很不方便了
    那么什么数据可以很好的标识一个学生,并且学生不能够自由更改呢?并且该数据还可以和其他数据进行很好的关联呢?
    其实答案很明显,那就是StudentId
    StudentId对于实际来说基本是没有意义的,因为其不可更改,并且仅仅是学生的一个编号,用来标识学生在学校里的身份,因此用其作为主键可以标识学生的唯一性;除此之外,利用StudentId还可以很好的与其他数据表连接,如班级信息,成绩信息,获奖信息等等;

    唯一键

    不知道你们有没有注意到,在上述代码中,我将StudentAccount加了一个Unique约束,这表示唯一键约束,主要是用来防止数据重复,这样的话就可以令学生注册的账户都不一样

    总结

    总的来说,主键就是一个对数据没有较大意义,但是具有无重复性,可以唯一标识表中的每一条记录,最简单的例子就是咱们的身份证,标识了你这个人,选择主键也尽量往这个原则上去选,并且,在SQL中,每张表都最好需要加上一个主键,这样可以很好的建立数据关联

    本文地址:https://blog.csdn.net/weixin_44985601/article/details/108961454