本文共 1410 字,大约阅读时间需要 4 分钟。
表和表之间的联系
通过设置不同形式的外键来体现表和表的不同关系
既可以把表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)表示将三个字段建成一个字段,在这样的定义情况下,我们的第三张表中,每条记录不能完全重复,否则违反主键规则 )