外键
注意,外键所在的表一般被称为从表,被引用的表被称为主表
。
直接删除主表会报错,因为主表被从表(有外键的那个表)所引用,所以,删除主表(被引用数据的表)之前,要先删除子表(外键所在的表),然后再去删除主表,就不会报错了。
图中的注意第二条,所示外键名是不允许加引号的,不管是单引号也好还是双引号也好,都不允许。
通过外键去引用别的表中对应列的数据,之所以叫外键,是因为通过此键可以外接到其他表中的数据。
september2024the11thWednsday
创建外键
语句:
ALTER TABLE student ADD CONSTRAINT fk_id FOREIGN KEY(gid) REFERENCES
grade(id);
创建外键后,通过表创建语句查看表的详细结构
,结果如下:
CREATE TABLE
student
(sid
int NOT NULL,sname
varchar(36)DEFAULT NULL,
gid
int NOT NULL, PRIMARY KEY (sid
), KEY
fk_id
(gid
), CONSTRAINTfk_id
FOREIGN KEY (gid
) REFERENCES
grade
(id
) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ci
csharp
创建外键时,关于外键的语句:
KEY `fk_id` (`gid`),
CONSTRAINT `fk_id` FOREIGN KEY (`gid`)
REFERENCES `grade` (`id`)
删除外键
语句:
ALTER TABLE student DROP FOREIGN KEY fk_id;
删除外键后,通过表创建语句查看表的详细结构
,结果如下:
CREATE TABLE
student
(sid
int NOT NULL,sname
varchar(36)DEFAULT NULL,
gid
int NOT NULL, PRIMARY KEY (sid
), KEY
fk_id
(gid
) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ci
cpp
删除外键后,剩下的关于外键的语句:
KEY `fk_id` (`gid`)
添加外键约束
的参数说明:
cascade
,小瀑布;层叠这里可以理解为
级联
,意思是,改动一个表,另一个表也会被影响,注意,这里的改动
,分为两个方向,一个是删除
,另一个是更新
,可以分别指定,即可以单独只指定删除,或者单独只指定更新,也可以同时指定删除和更新 。
例如,指定删除为级联(cascade)操作 ,指定更新为约束(restrict)操作
september2024the14thSaturday
删除外键
:
关联表的关系:
September15th2024Sunday
交叉
连接:
本例交叉连接的结果是:
把所有的员工放入所有的部门中,4个部门中每个部门都有4个员工,所以是4x4=16条数据记录,
也可以从员工的角度看,那就是,每个员工都同时归属于4个部门,
内连接
:
employee:
department:
内连接
查询:SELECT employee.name,department.dname FROM department JOIN employee ON department.did=employee.did;
注意,在日常的查询语句中,各个字段之间一定要加上逗号,否则查询报错,如下:SELECT employee.name
,
department.dname FROM department JOIN employee ON department.did=employee.did;字段间有逗号的,语句会顺利执行,
SELECT employee.name department.dname FROM department JOIN employee ON department.did=employee.did;
字段间没有逗号的,语句执行时会报错,
外连接
查询:
左外连接,以左表为主,
示为空右外连接,以右表为主,
不管左外还是右外,
1.谁在右侧,就以谁为主,
2.符合
ON
条件的记录,主表里的统统显示出来,从表规则是有的就显示,没有的要标记为NULL
,
复合条件连接
查询:
举例:
SELECT employee.name,employee.age,department.dname FROM department JOIN employee ON department.did=employee.did ORDER BY age;
子查询
:
带有子查询的select语句,子查询会被小括号包起来,将先进行子查询,然后以拿到的结果作为过滤条件再继续查询,子查询先儿子再爸爸,
注意,子查询必须被小括号包围。
september2024the17thTuesday