SQL Server 2008 ——关系

关系定义:

表和表之间的联系

实现形式:

通过设置不同形式的外键来体现表和表的不同关系

分类:(假设A表和B表)

一对一

既可以把表A的主键充当表B的外键

也可以把表B的主键充当表A的外键

一对多

A表的主键添加到B表的外键

或者讲:把a表的主键添加到B表来充当B表的外键

通俗的说就是:在多的一方添加外键。(如下图)

多对多

       多对多必须通过单独的一张表来表示,即通过第三张表来表示A表和B表之间的关系。

例如: 

班级和老师的关系   

老师和学生之间的关系

在关系表中:

      1班和2班均有王老师上课,实现了从表A到表B的多对一关系

      1班有两个老师给其上课,实现了从A表到B表的一对多关系

     王老师给1班和2班上课,实现了从B表到A表的一对多关系

     王老师和赵老师都给1班上课,实现了从B表到A表的多对一的关系。

     从而实现了整体上多对多的关系。

 

 

        在关系表中,要想表现班级信息和教师信息两个表格的关系,至少需要班级id”教师id”两个字段。才能说明两个表的之间多对多的关系,但是为了具体的说明,我加上了授课课程字段和教师信息字段

 

      那么在关系表中,如何选取主键呢?首先根据选取主键的目的——不允许重复元素,避免数据冗余可知,班级id字段、教师id字段、教师姓名字段和授课课程字段均不可单独作为主键。所以我们就需要将这几个字段看成一个整体,然后定义为字段,如下图。为了防止在关系表中班级id和教师id字段中写的编号并没在班级信息和教师信息表中出现过,这时就需要将这两列设置为外键。

多对多关系代码实现

 

--班级表
create table banji
(
	banji_id int primary key,
	banji_num int not null,
	banji_name nvarchar(100),
)

--教师
create table jiaoshi
(
	jiaoshi_id int primary key,
	jiaoshi_name nvarchar(100)
)

--第三张表,用来描述模拟班级和教师的关系
create table banji_jiaoshi_mapping
(	--本表有且只有一个主键,外键有两个:banji_id,jiaoshi_id
	banji_id int constraint fk_banji_id foreign key references banji(banji_id),
	-- 上面一行中(从左到右):banji_id表示字段名,constraint表示约束,fk_banji_id表示此字段的约束名(可省略),references banji(banji_id)表示约束来自那个表的那个表的那个字段
	jiaoshi_id int foreign key references jiaoshi(jiaoshi_id),
	kecheng nvarchar(20),
	constraint pk_banji_id_jiaoshi_id primary key (banji_id,jiaoshi_id,kecheng)
	--constraint表示强制约束	
	--pk_banji_id_jiaoshi_id为约束名	
	--	(banji_id,jiaoshi_id,kecheng)表示将三个字段建成一个字段,在这样的定义情况下,我们的第三张表中,每条记录不能完全重复,否则违反主键规则
	
)

																				


 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aiming66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值