借此机会,我们要向大家引入一个极其重要的概念——主键(Primary key)。事实上,在一般情况下,我们对整张表去重是没有效果的,就像这样:
虽然例句(3)可以被顺利执行,但我只会原封不动地返回整张表给你。换句话说,DISTINCT不会发挥去重效果,这正是因为主键的存在。
MagicSQL说得对,简单来讲,主键就是一张表中的特殊列,它含有的列值被称为主键值。由于表中的每一行数据都会对应不同的主键值,所以主键可以被视为一组标识,它就像“指纹”一样用来区别行与行,使得每一行都成为表中唯一的存在。其实在联络清单中,girl_id正是该表的主键。
大家可以仔细观察一下,girl_id列中不含有重复的数据,这是因为主键值不允许重复,所以只要涉及主键列的去重操作都没有效果。其实关于主键还有另一种理解方式。大家都知道列名不能重复,这是因为各个列装载的是不同类别的信息。主键也有类似的作用,下面我们将对一张简易表A进行变换。
大家可以看到,A表的主键就是编码列,其中的主键值不重复:101、102和103。当我们对行与列进行翻转之后,同学们会发现,主键值变成了不重复的列名,而原本的列名又具有了类似于主键的标识作用。因此我们不妨这样理解,列名在纵向区别各类信息的所属,而主键值则在横向区别不同的信息单位。
在日常操作中,我们创建的每一张表中都应当含有主键。虽然表也可以在没有主键的情况下创建成功,但主键不只是简单被用作标识的。
事实上,主键的运用非常巧妙。我们甚至可以这样说,主键就是连接关联表的核心,是我们创建关联表的主要工具,也是我们梳理关联表层级关系的线索。那么,什么是所谓的关联表呢?
简单来讲,关联表就是几张各司其职,但存在内部联系的表。关联表之所以存在内部联系,正是因为它们在合力记录一件事所产生的数据。
如果我们把一个数据库看作一家欣欣向荣的公司,那么该数据库存储的关联表就好比这家公司设立的各个部门。虽然每个部门负责的具体事务不同,但它们都是为了公司的发展而存在的,而且为了让各部门之间存在有效的沟通,相互的联系往来一定必不可少。