SQL SERVER 数据库主键和外键的思考

本文介绍了数据库中主键和外键的概念及其作用,探讨了主键的设计原则,并讲解了如何在外键中建立表间的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是主键:

数据库主键是指表中一个列或者列的组合,其值能够唯一的标识表中的每一个行。这样的一列或者多列成为表的主键,通过它可以强制表的实体完整性。当创建或者更改表时可以通过定义PRIMARY KEY约束来创建主键,一个表只能有一个主键约束,而且主键约束中的列不能是空值,由于主键约束确保唯一数据,所一经常来定义标识列。

每一个表都必须定义一个主键吗?

我个人认为这个问题要看我们的表的功能,利用来存储大量数据,并需要经常查询的,建立主键可以加快查询效率,从而降低服务器的负担,但是如果没有这样的需求,建立主键反而消耗资源,所以这种情况下就没有必要建立主键了。

有些人认为:虽然在有些数据库中,主键不是必须的,但是最好为每个表都设置一个主键,不管是但主键还是复合主键,它存在代表着表结构的完整性,表的记录必须得有唯一区分的字段,主键主要是用于其他表的外键关联,以及本记录的修改与删除。

主键的作用:

1、 从上面的定义可以看出,主键是用于唯一标识数据库表中一行数据的。

2、 作为一个可以被外键有效引用的对象。

主键的设计原则:

1、 主键应当是对用户没有意义的,比如说用户登陆一个系统的时候的登录id;而这种情况就不可能了:“学生表”需要支持这样的需求“学生注销后,可以重新激活自己的信息,而且还要保持自己的号码跟原来的一直”,这样的话主键就不能满足要求了。

2、 唯一性,这个原则就不用多说了。

3、 非空性:主键的值是不可重复的,也不可以为空。

什么是外键:

外键是建立于表与表之间的联系,方便程序的编写。

外键的特点:

1、 外键保证了数据的完整性

2、 使用外键,简单直观,可以直接在数据模型中体现,无论是设计、维护等等。

3、 外键在调试程序的时候可能会带来一些麻烦。

如何插入外键:


如上图所示,数据库中有三个表,下面我们给news和category表设置关系


如图所示,邮件单击“数据库关系图”,选择“新建数据库关系图”


出现上面的“添加表”

选择要添加的表的名称,将这三个表全部添加到里面去(如下图所示)


我们将news的categoryId设置为category的Id的外键




单击添加按钮



选择上边的“表和列规范”左边的三个小点号的按钮,点开后如下图所示



### SQL Server主键的关系及用法 #### 什么是主键主键是一种用于唯一标识表中每一行记录的约束。它确保表中的每一条记录都具有唯一的标识符,从而避免重复数据数据冗余。通常情况下,主键会选择一个无实际业务含义的字段(如 `id`),其数据类型通常是整数型(`int` 或其他数值类型)。如果未显式命名主键,则数据库会自动生成一个名称[^2]。 以下是创建带有主键的表的一个示例: ```sql create table dept ( dept_id int constraint pk_dept_id primary key, dept_name nvarchar(100) not null, dept_address nvarchar(100) not null ); ``` #### 什么是是指在一个表中引用另一个表的主键的字段。通过定义,可以在两个表之间建立关联关系,从而使数据保持一致性。例如,在课程表 (`Course`) 教师表 (`Teacher`) 的例子中,`Course` 表中的某个列可能是 `Teacher` 表某列的,表示这些课程由特定的教师教授[^3]。 在的帮助下,可以实现跨表的数据验证功能。当尝试向包含的表插入数据时,只有当所指向的主键存在于目标表中时,操作才会成功;否则将抛出错误。 下面是一个设置的例子: ```sql -- 创建 Teacher 表并指定主键 create table teacher ( teacher_id int constraint pk_teacher_id primary key, name nvarchar(50), department nvarchar(100) ); -- 创建 Course 表并将 teacher_id 列设为 create table course ( course_id int constraint pk_course_id primary key, title nvarchar(100), teacher_id int constraint fk_course_teacher references teacher(teacher_id) ); ``` #### 如何修改现有表以添加主键? 对于已经存在的表,可以通过 `ALTER TABLE` 命令为其添加主键: ##### 添加主键 ```sql alter table XueShengTable add constraint PK_StudentId primary key(StudentId); ``` ##### 添加 假设有一个学生表 (`XSB`) 登录表 (`DLB`),其中希望将 `DLB.XH` 设为,参照 `XSB.XH` 主键: ```sql alter table DLB add constraint FK_DLB_XSB foreign key(XH) references XSB(XH); ``` 以上命令实现了两表间基于学号 (`XH`) 的关联逻辑[^4]。 #### 主键的作用对比 | 特性 | 主键 | | |--------------|----------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------| | **作用** | 确保表内的每一行都有唯一标识 | 维护不同表之间的关系 | | **数量限制** | 每个表只能拥有一个主键 | 单一表可存在多个 | | **空值支持** | 不允许为空 | 允许为空 | #### 总结 主键是构建规范化数据库结构的重要组成部分。主键负责保证单表内部数据的一致性唯一性,而则用来维护多表间的联系,增强整个系统的完整性控制能力[^1]^。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值