菜鸟学数据库(四)——超键、候选键、主键、外键

这些年的一些经历告诉我,很多初学者搞不清超键、候选键等,被数据库中的各种键搞的一头雾水。下面就跟大家一起聊聊数据库中的那些键。


首先看看各种键的定义:

元组是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,每列就是一个属性。 在二维表里,元组也称为记录

超键(super key):在关系中能唯一标识元组的属性集称为关系模式的超键

候选键(candidate key):不含有多余属性的超键称为候选键

主键(primary key):用户选作元组标识的一个候选键称为主键

外键(foreign key)如果关系模式R1中的某属性集不是R1的主键,而是另一个关系R2的主键则该属性集是关系模式R1的外键。



结合实例的具体解释:


假设有如下两个表:

学生(学号,姓名,性别,身份证号,教师编号)

教师(教师编号,姓名,工资)


超键:

由超键的定义可知,学生表中含有学号或者身份证号的任意组合都为此表的超键。如:(学号)、(学号,姓名)、(身份证号,性别)等。


候选键:

候选键属于超键,它是最小的超键,就是说如果再去掉候选键中的任何一个属性它就不再是超键了。学生表中的候选键为:(学号)、(身份证号)。


主键:

主键就是候选键里面的一个,是人为规定的,例如学生表中,我们通常会让“学号”做主键,教师表中让“教师编号”做主键。


外键:

外键比较简单,学生表中的外键就是“教师编号”。外键主要是用来描述两个表的关系。


其实这些键还是比较容易区分的,只是初学者一下子看到好几个名字相似的概念,容易自己把自己搞晕,自己给自己制造困难。多读两遍定义,然后结合实例很容易就能把它们区分开。希望这篇文章可以给一些初学者一点点的帮助。


### 数据库主键候选超键是否允许为空的规定 #### 主键 (Primary Key) 主键不允许为空。这是因为在关系型数据库设计中,主键用于唯一标识表中的每一行记录。如果主键字段为空,则无法实现这一功能。因此,定义为主键的列会自动设置为 `NOT NULL` 属性,确保每条记录都有唯一的标识符[^1]。 ```sql CREATE TABLE example ( id INT PRIMARY KEY NOT NULL, name VARCHAR(255) ); ``` #### (Foreign Key) 对于而言,默认情况下是可以为空的,除非显式指定了 `NOT NULL` 约束条件。当为空时,表示该行数据不关联到父表中的任何一条特定记录。然而,在某些应用场景下,为了保持参照完整性,可能会强制要求不能为空[^2]。 ```sql CREATE TABLE orders ( order_id INT PRIMARY KEY NOT NULL, customer_id INT REFERENCES customers(customer_id), product_name VARCHAR(255) ); -- 或者指定不可为空 ALTER TABLE orders MODIFY COLUMN customer_id INT NOT NULL; ``` #### 候选 (Candidate Key) 候选同样也不允许为空。因为候选具备唯一性和非空性的特点,它能够成为主键的选择之一。一旦某个属性被认定为候选,就意味着它可以用来唯一地识别实体实例,并且其值不能为空。 ```sql CREATE UNIQUE INDEX idx_email ON users(email); -- email 是候选的例子 ``` #### 超键 (Superkey) 理论上讲,超键包含了足够的信息来区分所有的元组(行),所以即使其中部分成员可以接受空值的存在,只要整个组合仍然能保证唯一性即可满足超键的要求。但是实际应用中通常不会存在完全由可空字段构成的有效超键,因为这会导致难以维护的数据冗余问题以及查询效率低下等问题。 综上所述: - **主键** 和 **候选** 不允许为空; - **** 默认允许为空,但可以根据业务需求设定为不可为空; - 对于 **超键** 的情况较为复杂,取决于具体的设计考虑因素,但在实践中很少会出现全部组成部分均可为空的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值