当前位置:首页 > 问答 > 正文

sqlserver里怎么搞一对多关系,方法和思路聊聊吧

在 SQL Server 里搞一对多关系,说白了就是让一张表里的一条记录,能对应另一张表里的好多条记录,就像是一个班级(一张表)里有很多个学生(另一张表),一个班级对应多个学生,但每个学生只属于一个班级,这是数据库设计里最基础、最常用的套路。

核心思路就一句话:在“多”的那张表里,存上“一”的那张表的“身份证”。

具体怎么搞呢?方法和步骤如下:

第一步:先想清楚谁是一,谁是多 咱们有两个实体:部门员工,一个部门(比如销售部)可以有很多员工,但一个员工通常只属于一个部门(这里不考虑兼职)。部门 一”的一方,员工 多”的一方,这是设计的前提,一定要先理清。

第二步:创建“一”的表 我们先创建“一”的表,也就是主表,通常会给这个表一个唯一的、不重复的编号,作为它的“主键”,这就是它的“身份证”,在 SQL Server 里,一般用 IDENTITY 关键字让这个编号自动增长,非常方便。

CREATE TABLE 部门 (
    部门ID INT PRIMARY KEY IDENTITY(1,1), -- 主键,自动增长的部门身份证
    部门名称 NVARCHAR(50) NOT NULL
);

(参考 SQL Server 官方关于 CREATE TABLE 和 PRIMARY KEY 约束的说明)

第三步:创建“多”的表,并带上“一”的身份证 这是最关键的一步,创建“多”的表(员工表)时,除了员工自己的信息(比如姓名),必须增加一个字段,用来存放它所属的那个“一”的记录的“身份证”,也就是部门ID,这个字段就叫“外键”。

CREATE TABLE 员工 (
    员工ID INT PRIMARY KEY IDENTITY(1,1),
    姓名 NVARCHAR(50) NOT NULL,
    部门ID INT NOT NULL, -- 这个就是关键字段,用来存部门表的“部门ID”
    -- 其他字段...
);

表是建好了,但关系还没“锁死”,光靠这个字段,你随便写个数字(比如999)进去,系统也不知道对不对,因为可能根本没有ID为999的部门,所以需要建立约束。

第四步:建立外键约束,把关系“锁死” 我们需要告诉 SQL Server:“员工表里的这个‘部门ID’字段,不是随便填的,它必须老老实实地引用‘部门表’里已经存在的‘部门ID’。” 这就是“外键约束”。

ALTER TABLE 员工
ADD CONSTRAINT FK_员工_部门 -- 给这个约束起个名字
FOREIGN KEY (部门ID) -- 指明本表哪个字段是外键
REFERENCES 部门(部门ID); -- 指明它引用哪个表的主键

(参考 SQL Server 官方关于 FOREIGN KEY 约束的文档)

做完这一步,一对多关系就正式建立了,它的效果是:

  1. 保证数据不乱来:你现在没法在员工表里插入一个不存在的部门ID,必须先有部门,才能有属于这个部门的员工。
  2. 防止随意删除:如果某个部门(比如ID为1的部门)下面还有员工,你就不能直接删除这个部门记录,系统会报错,防止你误删导致“孤儿”员工(不知道属于哪个部门的员工)出现。
  3. 方便查询和关联:这是建立关系最大的好处,你可以用一句简单的 JOIN 查询,就把两个表的数据像拉链一样合在一起,查出每个员工属于哪个部门,或者一个部门下所有员工名单。
    SELECT 员工.姓名, 部门.部门名称
    FROM 员工
    INNER JOIN 部门 ON 员工.部门ID = 部门.部门ID;

一些实用的补充思路:

  • 关于外键字段:通常就用整数(INT)类型,和它引用的主键类型一致,它允许重复(因为多个员工属于同一个部门),但一般不允许为NULL(除非你想允许员工不属于任何部门)。
  • 关于约束行为:上面说的“不能删除有员工的部门”是默认行为,你其实可以通过设置外键约束的“级联”规则来改变,比如设置 ON DELETE CASCADE,那么删除一个部门时,它下属的所有员工记录会被自动一起删除,这个功能要慎用,威力很大。
  • 关于性能:在“多”的表(员工表)的那个外键字段(部门ID)上建一个索引,通常会大大提高查询速度,因为系统找起来更快。
  • 先有“一”,后有“多”:这个顺序不仅体现在逻辑上,在插数据时也要注意:一定要先往部门表里插入几个部门,拿到具体的部门ID,然后才能在往员工表插入数据时,在部门ID字段填上正确的、存在的值。

在 SQL Server 里搞一对多关系,技术操作上就是四步:理清关系、创建主表(一)、创建从表(多)并加上外键字段、用 FOREIGN KEY 约束把两者绑定,它的本质是一种数据完整性保护,核心目的是让数据之间逻辑清晰、准确可靠,并且为高效的数据查询和组合打下坚实的基础。

sqlserver里怎么搞一对多关系,方法和思路聊聊吧