第一章 约束
第01节 基础理论
1、约束概述
什么是约束呢?约束有什么作用呢?
生活当中的约束:
法律的约束、道德的约束
前面学习过的约束:
XML当中 DTD约束、Schema约束
约束:
可以保证数据的完整性、正确性。
例如:
1、身份证号码,不能重复。我们会使用到 不能重复的约束,就是 唯一约束
2、姓名,不能为null。我们会使用到 不能为空的约束,就是 非空约束
3、表和表之间建立的关系,可以使用到 主键和外键等约束
2、约束分类
(1) 非空约束:建表时添加、建表后添加、删除操作
(2) 唯一约束:建表时添加、建表后添加、删除操作
(3) 主键约束:建表时添加、建表后添加、删除操作
(4) 外键约束:建表时添加、建表后添加、删除操作
第02节 非空约束
1、建表时添加非空约束
语法格式
-- 语法格式
CREATE TABLE 表名称(
列名1 数据类型1,
列名2 数据类型2 NOT NULL,
列名3 数据类型3
);
-- 举例说明
CREATE TABLE IF NOT EXISTS BiaoOne(
uid INT,
uname VARCHAR(20) NOT NULL,
uage INT
);
案例代码
-- 1. 创建表的时候,添加非空约束
CREATE TABLE IF NOT EXISTS BiaoOne(
uid INT,
uname VARCHAR(20) NOT NULL,
uage INT
);
-- 2. 添加数据
INSERT INTO BiaoOne VALUES (1,'张三',23);
INSERT INTO BiaoOne VALUES (2,NULL,24);
INSERT INTO BiaoOne VALUES (3,'王五',25);
-- 3. 查询表
SELECT * FROM BiaoOne;
-- 4. 查询非空约束SQL语句,查询表结构
DESC BiaoOne;
2、建表后添加非空约束
语法格式
-- 语法格式
ALTER TABLE 表名称 MODIFY 列名 数据类型 NOT NULL;
-- 举例说明
ALTER TABLE BiaoOne MODIFY uage INT NOT NULL;
案例代码
-- 1. 查看表结构
DESC BiaoOne;
-- 2. 给uage这一列添加非空约束
ALTER TABLE BiaoOne MODIFY uage INT NOT NULL;
-- 3. 查询表
SELECT * FROM BiaoOne;
-- 4. 插入数据
INSERT INTO BiaoOne VALUES (4,'赵六',NULL);
/*
注意事项:
如果我们采用的是建表之后,再去添加非空约束 NOT NULL
需要注意,如果之前存在 NULL 值,则添加非空约束会出错。
*/
3、删除非空约束
语法格式
-- 语法格式
ALTER TABLE 表名称 MODIFY 列名 数据类型;
-- 举例说明
ALTER TABLE BiaoOne MODIFY uage INT;
案例代码
-- 1. 创建表的时候,添加非空约束。
CREATE TABLE IF NOT EXISTS BiaoOne(
id INT,
uname VARCHAR(20) NOT NULL
);
-- 2. 查看表信息,查看非空约束的情况
DESC BiaoOne;
-- 3. 删除非空约束
ALTER TABLE BiaoOne MODIFY uname VARCHAR(20);
-- 4. 插入数据,插入非空的值 和 为空的值
INSERT INTO BiaoOne VALUES (1,'张三'),(2,NULL);
-- 5. 添加非空约束
ALTER TABLE BiaoOne MODIFY uname VARCHAR(20) NOT NULL;
-- 6. 修改值,修改为为不为空的情况
UPDATE BiaoOne SET uname='李四' WHERE id=2;
-- 7. 查询表
SELECT * FROM BiaoOne;
-- 8. 删除非空约束
ALTER TABLE BiaoOne MODIFY uname VARCHAR(20);
第03节 唯一约束
1、建表时添加唯一约束
语法格式
-- 语法格式CREATE TABLE IF NOT EXISTS 表名称( 列名1 数据类型1, 列名2 数据类型2 UNIQUE, 列名3 数据类型3);-- 举例说明CREATE TABLE IF NOT EXISTS BiaoTwo( id INT, uname VARCHAR(20) UNIQUE, uage INT);
案例代码
-- 1. 删除表,如果存在则删除DROP TABLE IF EXISTS BiaoTwo;-- 2. 创建数据表的时候,添加唯一约束CREATE TABLE IF NOT EXISTS BiaoTwo( id INT, uname VARCHAR(20) UNIQUE, uage INT);-- 3. 查看表结构,查询表DESC BiaoTwo;SELECT * FROM BiaoTwo;-- 4. 添加数据INSERT INTO BiaoTwo VALUES (1,'张三',23);INSERT INTO BiaoTwo VALUES (2,'李四',24);INSERT INTO BiaoTwo VALUES (3,'王五',25);INSERT INTO BiaoTwo VALUES (4,'张三',26);INSERT INTO BiaoTwo VALUES (5,NULL,27);INSERT INTO BiaoTwo VALUES (6,NULL,28);/* 注意事项: 如果我们采用创建表的形式,添加唯一约束的话。 为 null 的值,可以添加N个,不会被唯一约束限定。*/
2、建表后添加唯一约束
语法格式
-- 语法格式ALTER TABLE 表名称 MODIFY 列名 数据类型 UNIQUE;-- 举例说明ALTER TABLE BiaoTwo MODIFY uage INT UNIQUE;
案例代码
-- 1. 删除表,如果存在则删除DROP TABLE IF EXISTS BiaoTwo;-- 2. 创建数据表的时候CREATE TABLE IF NOT EXISTS BiaoTwo( id INT, uname VARCHAR(20), uage INT);-- 3. 查看表结构,查询表DESC BiaoTwo;SELECT * FROM BiaoTwo;-- 4. 添加唯一约束ALTER TABLE BiaoTwo MODIFY uage INT UNIQUE;-- 5. 添加数据INSERT INTO BiaoTwo VALUES (1,'张三',23);INSERT INTO BiaoTwo VALUES (2,'李四',24);INSERT INTO BiaoTwo VALUES (3,'王五',25);INSERT INTO BiaoTwo VALUES (4,'赵六',25);INSERT INTO BiaoTwo VALUES (5,'前妻',NULL);INSERT INTO BiaoTwo VALUES (6,'王八',NULL);/** 注意事项1: 如果建表后,添加唯一约束,NULL值,无视限定,仍然可以添加NULL重复 注意事项2:如果建表后,表当中列存在重复值,给这列添加唯一约束,会报错。 注意事项3:如果建表后,表当中的列存在重复的 NULL值,这列添加唯一约束,不会报错。**/
3、删除唯一约束
语法格式
-- 语法格式ALTER TABLE 表名称 DROP INDEX 列名;-- 举例说明ALTER TABLE BiaoTwo DROP INDEX uname;
案例代码
-- 1. 删除表,如果存在则删除DROP TABLE IF EXISTS BiaoTwo;-- 2. 创建数据表的时候,添加唯一约束CREATE TABLE IF NOT EXISTS BiaoTwo( id INT, uname VARCHAR(20) UNIQUE, uage INT);-- 3. 查看表结构,查看表信息DESC BiaoTwo;SELECT * FROM BiaoTwo;-- 4. 删除唯一约束ALTER TABLE BiaoTwo DROP INDEX uname;-- 5. 添加唯一约束ALTER TABLE BiaoTwo MODIFY uname VARCHAR(20) UNIQUE;-- 6. 插入数据INSERT INTO BiaoTwo VALUES (1,'张三',23);INSERT INTO BiaoTwo VALUES (2,'李四',24);INSERT INTO BiaoTwo VALUES (3,'王五',25);INSERT INTO BiaoTwo VALUES (4,'张三',26);INSERT INTO BiaoTwo VALUES (5,NULL,27);INSERT INTO BiaoTwo VALUES (6,NULL,28);-- 7. 删除记录DELETE FROM BiaoTwo WHERE id=4;
第04节 主键约束
1、建表时添加主键约束
语法格式(非自增形式的主键)
-- 语法格式CREATE TABLE IF 表名称( 列名1 数据类型1 PRIMARY KEY, 列名2 数据类型2, 列名3 数据类型3);-- 举例说明 CREATE TABLE IF NOT EXISTS BiaoThree( id INT PRIMARY KEY, uname VARCHAR(20));
主键的特点:
1、非空且唯一 主键所在的列,要求不能为
NULL
值,而且不能出现重复的数据。2、一张表当中,只能存在一个主键。
3、我们可以通过主键,去确定这一行的信息。
案例代码
-- 1. 删除表DROP TABLE IF EXISTS BiaoThree;-- 2. 创建表CREATE TABLE IF NOT EXISTS BiaoThree( id INT PRIMARY KEY, uname VARCHAR(20));-- 3. 查看表 看结构、看内容DESC BiaoThree;SELECT * FROM BiaoThree;-- 4. 插入数据INSERT INTO BiaoThree VALUES (1,'孙佳佳');INSERT INTO BiaoThree VALUES (2,'彭俊杰');INSERT INTO BiaoThree VALUES (2,'定浩');INSERT INTO BiaoThree VALUES (NULL,'腚耗');INSERT INTO BiaoThree VALUES (NULL,'郭龙');/* 主键的特点: 1. 非空且唯一 2. 不能存在两个主键在同一个表当中*/
语法格式(自增形式的主键)
-- 语法格式CREATE TABLE IF 表名称( 列名1 数据类型1 PRIMARY KEY AUTO_INCREMENT, 列名2 数据类型2, 列名3 数据类型3);-- 举例说明 CREATE TABLE IF NOT EXISTS BiaoFour( id INT PRIMARY KEY AUTO_INCREMENT, uname VARCHAR(20));
设置自增之后,注意事项:
1、如果添加主键为 NULL 值,默认从1开始
2、如果这条记录删除,下次添加会跳过删除这行记录。(之前 id为2的删除,下次添加 id为3)
3、如果跳过某些顺序添加,则看上一行 id值。(直接添加 id为10,下次添加为NULL,则 id为11)
4、如果跳过某些顺序添加,则看上一行 id值。(直接添加 id为10,下次添加为 2,则id为2,放在id为1的后面)
案例代码
-- 1. 删除表DROP TABLE IF EXISTS BiaoFour;-- 2. 创建表CREATE TABLE IF NOT EXISTS BiaoFour( id INT PRIMARY KEY AUTO_INCREMENT, uname VARCHAR(20));-- 3. 查看表 看结构、看内容DESC BiaoFour;SELECT * FROM BiaoFour;-- 4. 插入数据INSERT INTO BiaoFour VALUES (1,'孙佳佳');INSERT INTO BiaoFour VALUES (2,'彭俊杰');INSERT INTO BiaoFour VALUES (NULL,'定浩'); INSERT INTO BiaoFour VALUES (NULL,'腚耗');INSERT INTO BiaoFour VALUES (NULL,'郭龙'); INSERT INTO BiaoFour VALUES (10,'黄杰');-- 5. 删除表记录DELETE FROM BiaoFour WHERE id = 4;
2、建表后添加主键约束
语法格式(自增形式的主键)
-- 语法格式ALTER TABLE 表名称 MODIFY 列名 数据类型 PRIMARY KEY AUTO_INCREMENT;-- 举例说明ALTER TABLE BiaoFour MODIFY id INT PRIMARY KEY AUTO_INCREMENT;
案例代码
-- 1. 删除表DROP TABLE IF EXISTS BiaoFour;-- 2. 创建表CREATE TABLE IF NOT EXISTS BiaoFour( id INT, uname VARCHAR(20));-- 3. 查看表 看结构、看内容DESC BiaoFour;SELECT * FROM BiaoFour;-- 4. 添加主键约束ALTER TABLE BiaoFour MODIFY id INT PRIMARY KEY AUTO_INCREMENT;-- 5. 插入数据INSERT INTO BiaoFour VALUES (1,'孙佳佳');INSERT INTO BiaoFour VALUES (2,'彭俊杰');INSERT INTO BiaoFour VALUES (NULL,'定浩'); INSERT INTO BiaoFour VALUES (NULL,'腚耗');INSERT INTO BiaoFour VALUES (NULL,'郭龙'); INSERT INTO BiaoFour VALUES (10,'黄杰');INSERT INTO BiaoFour VALUES (10,'佑威');-- 6. 删除表记录DELETE FROM BiaoFour WHERE id = 4;/* 注意事项1: 如果我们已经添加了NULL值,再去添加主键约束,不会报错,自动改变为主键的值 注意事项2: 如果我们已经添加了重复的非NULL值,再去添加主键约束,会报错。*/
3、删除主键约束
语法格式(自增形式的主键)
-- 语法格式 (先删除自动增长,再删除主键约束)ALTER TABLE 表名称 MODIFY 列名 数据类型; ALTER TABLE 表名称 DROP PRIMARY KEY;-- 举例说明 删除主键约束(在删除主键约束之前,先要删除自动增长)ALTER TABLE BiaoFour MODIFY id INT;ALTER TABLE BiaoFour DROP PRIMARY KEY;
案例代码
-- 1. 删除表DROP TABLE IF EXISTS BiaoFour;-- 2. 创建表CREATE TABLE IF NOT EXISTS BiaoFour( id INT PRIMARY KEY AUTO_INCREMENT, uname VARCHAR(20));-- 3. 查看表,看表结构,看表数据DESC BiaoFour;SELECT * FROM BiaoFour;-- 4. 删除主键约束(在删除主键约束之前,先要删除自动增长)ALTER TABLE BiaoFour MODIFY id INT;ALTER TABLE BiaoFour DROP PRIMARY KEY;-- 5. 插入数据INSERT INTO BiaoFour VALUES (1,'孙佳佳');INSERT INTO BiaoFour VALUES (2,'彭俊杰');INSERT INTO BiaoFour VALUES (NULL,'定浩'); INSERT INTO BiaoFour VALUES (NULL,'腚耗');INSERT INTO BiaoFour VALUES (NULL,'郭龙'); INSERT INTO BiaoFour VALUES (10,'黄杰');INSERT INTO BiaoFour VALUES (10,'佑威');
第05节 外键约束
1、为什么需要使用外键
案例代码
/* 为什么会存在外键约束呢? 主要是为了保证数据的合法性。 说白一点,就是说,一张表的数据,对另外的表数据有影响。 做增删改操作的过程当中,影响的数据的正确性。*/DROP TABLE IF EXISTS bumen;CREATE TABLE IF NOT EXISTS bumen( bumen_id INT, bumen_name VARCHAR(20));INSERT INTO bumen VALUES (1,'财务部'),(2,'生产部'),(3,'销售部');SELECT * FROM bumen;DROP TABLE IF EXISTS yuangong;CREATE TABLE IF NOT EXISTS yuangong( yuangong_id INT, yuangong_name VARCHAR(20), yuangong_bumen_id INT);INSERT INTO yuangong VALUES (1,'定浩',1);INSERT INTO yuangong VALUES (2,'腚耗',2);INSERT INTO yuangong VALUES (3,'郭龙',3);INSERT INTO yuangong VALUES (4,'黄杰',2);INSERT INTO yuangong VALUES (5,'佑威',4);SELECT * FROM yuangong;
外键约束应该具备有什么特点?
1、用于建立两张表之间的关联关系。
2、副表的外键,需要关联 主表的主键,或者是主表的唯一索引列。
3、如果建立了主外键关系的表,做 增删改的时候,就需要注意完整性正确性。
2、建表时添加外键约束
语法格式(外键需要关联主键)
-- 语法格式 CONSTRAINT 外键自定义的名称 FOREIGN KEY (外键列的名称) REFERENCES 主表的名称(主表的主键列名称) FOREIGN KEY (外键列的名称) REFERENCES 主表的名称(主表的主键列名称) -- 举例说明 CONSTRAINT 'yuangong_ibfk_1' FOREIGN KEY (yuangong_bumen_id) REFERENCES bumen(bumen_id) FOREIGN KEY (yuangong_bumen_id) REFERENCES bumen(bumen_id)
案例代码
-- 1. 创建部门表DROP TABLE IF EXISTS bumen;CREATE TABLE IF NOT EXISTS bumen( bumen_id INT PRIMARY KEY AUTO_INCREMENT, -- 部门表主键ID bumen_name VARCHAR(20));INSERT INTO bumen VALUES (1,'财务部'),(2,'生产部'),(3,'销售部');SELECT * FROM bumen;DESC bumen;-- 2. 创建员工表DROP TABLE IF EXISTS yuangong;CREATE TABLE IF NOT EXISTS yuangong( yuangong_id INT, yuangong_name VARCHAR(20), yuangong_bumen_id INT, FOREIGN KEY (yuangong_bumen_id) REFERENCES bumen(bumen_id) );INSERT INTO yuangong VALUES (1,'定浩',1);INSERT INTO yuangong VALUES (2,'腚耗',2);INSERT INTO yuangong VALUES (3,'郭龙',3);INSERT INTO yuangong VALUES (4,'黄杰',2);INSERT INTO yuangong VALUES (5,'佑威',4); -- 这条记录,添加失败,因为外键关系SELECT * FROM yuangong;DESC yuangong;
3、建表后添加外键约束
语法格式(外键需要关联主键)
-- 语法格式 ALTER TABLE 副表的名称 ADD FOREIGN KEY (副表的外键列名称) REFERENCES 主表的名称(主表的主键列名);-- 举例说明 ALTER TABLE yuangong ADD FOREIGN KEY (yuangong_bumen_id) REFERENCES bumen(bumen_id);
案例代码
-- 1. 创建部门表DROP TABLE IF EXISTS bumen;CREATE TABLE IF NOT EXISTS bumen( bumen_id INT PRIMARY KEY AUTO_INCREMENT, -- 部门表主键ID bumen_name VARCHAR(20));INSERT INTO bumen VALUES (1,'财务部'),(2,'生产部'),(3,'销售部');SELECT * FROM bumen;DESC bumen;-- 2. 创建员工表DROP TABLE IF EXISTS yuangong;CREATE TABLE IF NOT EXISTS yuangong( yuangong_id INT, yuangong_name VARCHAR(20), yuangong_bumen_id INT );-- 3. 添加外键约束ALTER TABLE yuangong ADD FOREIGN KEY (yuangong_bumen_id) REFERENCES bumen(bumen_id);INSERT INTO yuangong VALUES (1,'定浩',1);INSERT INTO yuangong VALUES (2,'腚耗',2);INSERT INTO yuangong VALUES (3,'郭龙',3);INSERT INTO yuangong VALUES (4,'黄杰',2);INSERT INTO yuangong VALUES (5,'佑威',4);SELECT * FROM yuangong;DESC yuangong;
4、删除外键约束
语法格式(外键需要关联主键)
-- 查询外键的名称SELECT CONSTRAINT_NAME FROM information_schema.key_column_usage tWHERE t.constraint_schema = '数据库的名称' AND TABLE_NAME = '数据表的名称';-- 语法格式 ALTER TABLE 副表名称 DROP FOREIGN KEY 外键的名字;-- 举例说明 ALTER TABLE yuangong DROP FOREIGN KEY yuangong_ibfk_1;
案例代码
-- 1. 创建部门表DROP TABLE IF EXISTS bumen;CREATE TABLE IF NOT EXISTS bumen( bumen_id INT PRIMARY KEY AUTO_INCREMENT, -- 部门表主键ID bumen_name VARCHAR(20));INSERT INTO bumen VALUES (1,'财务部'),(2,'生产部'),(3,'销售部');SELECT * FROM bumen;DESC bumen;-- 2. 创建员工表DROP TABLE IF EXISTS yuangong;CREATE TABLE IF NOT EXISTS yuangong( yuangong_id INT, yuangong_name VARCHAR(20), yuangong_bumen_id INT );-- 3. 添加外键约束ALTER TABLE yuangong ADD FOREIGN KEY (yuangong_bumen_id) REFERENCES bumen(bumen_id);-- 补充:查看当前表的外键名称SELECT CONSTRAINT_NAME FROM information_schema.key_column_usage tWHERE t.constraint_schema = 'mydb06' AND TABLE_NAME = 'yuangong';-- 4. 删除外键约束ALTER TABLE yuangong DROP FOREIGN KEY yuangong_ibfk_1;INSERT INTO yuangong VALUES (1,'定浩',1);INSERT INTO yuangong VALUES (2,'腚耗',2);INSERT INTO yuangong VALUES (3,'郭龙',3);INSERT INTO yuangong VALUES (4,'黄杰',2);INSERT INTO yuangong VALUES (5,'佑威',4);SELECT * FROM yuangong;DESC yuangong;
5、级联更新和级联删除
语法格式
-- 语法格式 ON UPDATE CASCADE -- 级联更新ON DELETE CASCADE -- 级联删除-- 举例说明 ALTER TABLE emp ADD FOREIGN KEY (emp_dept_id) REFERENCES dept(dept_id) ON UPDATE CASCADE;ALTER TABLE emp ADD FOREIGN KEY (emp_dept_id) REFERENCES dept(dept_id) ON DELETE CASCADE;ALTER TABLE emp ADD FOREIGN KEY (emp_dept_id) REFERENCES dept(dept_id) ON DELETE CASCADE ON UPDATE CASCADE;
特征:
我们如果添加了级联的操作(级联更新或者级联删除) 直接操作主表的时候,副表也会跟着变化。
这种操作,我们一般不建议使用,不推荐使用 级联的操作。(因为太危险了,很容易丢失数据)
案例代码
-- 1. 创建部门表DROP TABLE IF EXISTS bumen;CREATE TABLE IF NOT EXISTS bumen( bumen_id INT PRIMARY KEY AUTO_INCREMENT, -- 部门表主键ID bumen_name VARCHAR(20));INSERT INTO bumen VALUES (1,'财务部'),(2,'生产部'),(3,'销售部');SELECT * FROM bumen;DESC bumen;-- 2. 创建员工表DROP TABLE IF EXISTS yuangong;CREATE TABLE IF NOT EXISTS yuangong( yuangong_id INT, yuangong_name VARCHAR(20), yuangong_bumen_id INT );-- 3. 添加外键约束ALTER TABLE yuangong ADD FOREIGN KEY (yuangong_bumen_id) REFERENCES bumen(bumen_id);ALTER TABLE yuangong ADD FOREIGN KEY (yuangong_bumen_id) REFERENCES bumen(bumen_id) ON UPDATE CASCADE;-- 补充:查看当前表的外键名称SELECT CONSTRAINT_NAME FROM information_schema.key_column_usage tWHERE t.constraint_schema = 'mydb06' AND TABLE_NAME = 'yuangong';-- 4. 删除外键约束ALTER TABLE yuangong DROP FOREIGN KEY yuangong_ibfk_1;INSERT INTO yuangong VALUES (1,'定浩',1);INSERT INTO yuangong VALUES (2,'腚耗',2);INSERT INTO yuangong VALUES (3,'郭龙',3);INSERT INTO yuangong VALUES (4,'黄杰',2);INSERT INTO yuangong VALUES (5,'佑威',4);SELECT * FROM yuangong;DESC yuangong;-- 需求:想要把部门的id进行修改,销售部的id由3变成5,怎么办呢?UPDATE bumen SET bumen_id = 5 WHERE bumen_name = '销售部';
第二章 多表关系
第01节 基础理论
1、理论概述
什么是多表关系呢?
多表关系 指的是 多张表之间存在的数据联系。MySQL 称之为 "关系型数据库" 指的是 数据之间会存在 关联关系的。例如: 主键和外键关联当中,提到的两个表 "部门表" 和 "员工表" 他们就存在关联关系
2、常见关系
常见的关系有哪些呢?
(1) 一对一 例如: 身份证号码和人的关系(2) 一对多 例如: 部门和员工的关系(3) 多对多 例如: 学生和课程的关系
分析过程1
思考的过程:身份证号码和人为例
1、一个身份证号码对应一个人 OK 吗 ? OK的
2、一个人对应一个身份证号码吗? OK的
因此他们是 一对一的关系
分析过程2
思考的过程:部门和员工的关系为例
1、一个部门对应多个员工OK吗 ? OK的
2、一个员工对应多个部门OK吗? NO
因此他们是 一对多的关系
分析过程3
思考的过程:学生和课程的关系为例
1、一个学生对应多个课程OK吗 ? OK的
2、一个课程对应多个学生OK吗? OK的
因此他们是 多对多的关系
第02节 具体操作
1、一对一关系
举例
人和身份证号码的关系
操作
方式一: 在人这个表当中,建立主键,去关联 身份证表的外键。方式二: 在身份证这个表当中,建立主键,去关联 人表的外键。更多情况下,我们会 将两个信息,合并在一张表当中。
2、一对多关系
举例
部门和员工的关系
操作
在部门表当中,建立主键,在员工表当中,建立外键。由外键去关联主键。
画图
建表的原则:
1、在1
的一方,建立 主键
2、在N
的一方,建立 外键,由外键关联1
的主键
3、多对多关系
举例
学生和课程的关系
操作
1、需要在 学生表当中建立 主键2、需要在 课程表当中建立 主键3、建立一个中间表(例如:学生选课表)至少包含两列,分别作为外键,去关联各自的主键。
画图
建表的原则:
1、其中一个表,建立主键
2、另外一个表,建立主键
3、创建一个中间表,至少包含两列信息,分别作为外键,关联对应的主键