# 外键 ## 1,学习外键首先要明白表与表之间的关系 首先要换位思考 在考虑了这边 还要考虑另一边 然后在下定论 ### 判断表关系的语法 #### 图书与出版社 一本书可不可以有多个出版社 不可以 一个出版社可不可以出版多本书 可以 这就是一对多关系 #### 图书与作者 一本书可不可以有多个作者 可以 一个作者可不可以写多本书 可以 多对多的关系 ### 作者与作者信息 一个作者可不可以有多个个人信息 不可以 一个作者的个人信息能不能有多个作者 不可以 要么两个是一对一,要么没关系 primary key 主键约束,该约束的意思就是,该字段的值非空且不能重复 关键字 references 建立表与表之间的关系 foreign key 外键约束,意思就是该字段与另外一张表有联系.好比儿子必定有爸爸,要是有人想把爸爸K掉,儿子就肯定不干了!反之没儿子的人如果要被K,就没人管啦 ## 2,一对多 #foreign key会带来什么效果 1,在创建表的时候,先创建 被关联的表不带有foreign key 创建完在创建带有foreign key ```python create table dep( id int primary key auto_increment, dep_name char(10), dep_comment char(60) ); create table emp( id int primary key auto_increment, name char(15), gender enum('male','female') not null default 'male', dep_id int, foreign key (dep_id) references dep(id) 给这个dep_ip传入的id必须是 另一个表的id 而 referencnces 就是链接起另一张表 dep 里面一般都放的是令一张表的主键 且在给dep_id 传值的时候必须是另一张表有的id 如果没有就报错 on update cascade on delete cascade ); insert into dep (dep_name,dep_comment) values ('教学部','辅导学生,教授python'), ('外交','中国形象大屎'), ('技术部门','技术能力有限部门'); insert into emp (name,gender,dep_id) values ('jason','male',1), ('egon','male',2), ('taken','female',3); ``` ## 3,多对多 ```python # 图书表与作者表之间的关系 """ 仍然站在两张表的角度: 1.站在图书表:一本书可不可以有多个作者,可以!那就是书多对一作者 2.站在作者表:一个作者可不可以写多本书,可以!那就是作者多对一书 双方都能一条数据对应对方多条记录,这种关系就是多对多! """ # 先来想如何创建表?图书表需要有一个外键关联作者,作者也需要有一个外键字段关联图书。问题来了,先创建谁都不合适!如何解决? # 建立第三张表,该表中有一个字段fk左表的id,还有一个字段是fk右表的id create table author ( id int primary key auto_increment, name char(10)); create table book( id int primary key auto_increment, bname char(10), price int); insert into author (name) values ('egon'), ('jason'), ('yangxin'), ('alex'); insert into book (bname,price) values ('php从入门到消失',1000), ('葵花宝典',553), ('小泽玛利亚大战苍井空',200009), ('小泽精选',20000), ('小仓精选',2222); create table author2book( id int primary key auto_increment, author_id int, book_id int, foreign key (author_id) references author(id) on update cascade on delete cascade, foreign key (book_id) references author(id) on update cascade on delete cascade); insert into author2book(author_id,book_id) values (1,2), (2,3), (3,4), (1,4), (4,2); ``` ## 4,一对一 用户名 和用户信息 ```python 左边的表记录唯一对应右边的一条记录,反之也一样 create table username( id int primary key auto_increment, name char(10) not null, age int not null); insert into username(name,age) values ('jason',98), ('yangxin',18), ('wukai',10); create table card( id int primary key auto_increment, identity int unique,#该字段唯一 username_id int unique,#该字段唯一 foreign key (card_id) references username(id) on delete cascade on update cascade); insert into card(identity,username_id) values ('170020',1), ('125435',2), ('146547',3); ``` ## 5修改表 ```python # mysql对大小写不敏感!!! 语法: 1. 修改表名 ALTER TABLE 表名 RENAME 新表名; 2. 增加字段 ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…], ADD 字段名 数据类型 [完整性约束条件…]; ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST; ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; 3. 删除字段 ALTER TABLE 表名 DROP 字段名; 4. 修改字段 # modify只能改字段数据类型完整约束,不能改字段名,但是change可以! ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…]; ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…]; ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…]; ``` ## 6复制表 ```python #复制表 语法 create table 表名 select *from 被复制的表名 #只能复制表的结构+记录 不会复制 主键 外键 和索引 ```