3,外键之表关联关系,修改表,复制表

mac2022-06-30  39

今日内容:   一:外键    一对多:    多对多:    一对一:   二:了解知识点    复制表    修改表相关操作       前戏:    所有的信息都在一张表中所带来的的问题     1,表的结构不清晰     2,浪费硬盘空间     3,表的扩展性极差(是一个很难逃避的缺点)    类似于我们把所有的代码都写在同一个py文件中     在确定表与表之间的关系时,一定要换位思考(必须两方都考虑周全之后才能得出结论)     以员工表和部门表为例:      先站在员工表看能否有多个员工对应一个部门       即:        一个部门能否有多个员工        可以!!!(暂时只能确定员工单向多对一 部门)             在站在部门表看员工能否有多个部门对应一个员工       即:        一个员工能否在多个部门        不可以!!!     结论:员工表和部门表之间仅仅是单向的多对一      那么他们之间的表关系就是“一对多”             表关系中没有多对一一说,只有一对多       (无论是多对一还是一对多都叫"一对多")          2,如何让两种表有代码层面上真正的关联  就必须使用外键     什么是外键?      让表与表有硬性层面上的关系     foreign key      外键约束       1.在创建表的时候 必须先创建被关联表       2.插入数据的时候 也必须先插入被关联表的数据                     一:外键    表与表之间的关系:     要站在彼此不同的角度来考虑    1,判断表关系的最简单的语法          书籍与出版社的关系           一本书的出版社可不可以有多个,   不可以!!!      而一家出版社可不可以出版多本书,  可以!!!      一对多的关系          图书与作者表      一本书可不可以有多个作者      可以!!!      一个作者可不可以写多本书      可以!!!      多对多的关系           作者与作者详情      一个作者可不可以有多个详情   不可以!!!      一个作者详情可不可以有多个作者  不可以!!!      要么两者之间是一对一      要么两者之间没有任何关系         ps:通常将关系字段 称之为 外键字段     ****************************    一对多的外键字段  建在多的一方    多对多   建在第三张表了    一对一   外键字段建在任意一方都可以   但是推荐你建在查询频率较高的一方                           一对多:      建表:      create table dep(       id int primary key auto_increment,       dep_name varchar(32),       dep_desc varchar(64));             create table emp(       id int primary key auto_increment,       emp_name varchar(64),       emp_gender enum('male','female','others')default'male',       dep_id int not null,       foreign key(dep_id)references dep(id)       );             插入数据:       insert into dep(dep_name,dep_desc) values('技术','发动机');             insert into emp(emp_name,emp_gender,dep_id) values(        '张三','male',1),('李思','female',3),('网凉','female',2);             修改数据:       update emp set dep_id = 100 where id = 1;       这样不能直接修改数据,修改不了              ps:外键虽然能够帮你强制建立表关系 但是也会给表之间增加数据相关的约束                1,删除数据的时候  先删员工表的数据 再删部门表的数据         delete from emp where id = 4;         delete from dep where id = 3;               2,要想修改只能用级联更新,级联删除:            级联更新:on update cascade  同步更新            on delete cascade  同步删除                    建表:         create table emp(          id int primary key auto_increment,          emp_name char(32),          emp_gender enum('male','female','others') default'male',          dep_id int,          foreign key(dep_id) references dep(id)          on update cascade          on delete cascade);                   insert into emp(emp_name,dep_id) values('张三',1),('赵四',3),('田七',2);         

 

            多对多:          图书与作者表     一定要换位思考      先站在图书       多本书能否有一个作者        一个作者能否写多本书 可以!!!            再站在作者       多个作者能否和写一本书          一本书能否有多个作者 可以!!!              创建表:       create table book(        id int primary key auto_increment,        book_name char(32),        price int,        author_id int,        foregin key(author_id) references author(id)        on update cascade        on delete cascade        );               create table author(        id int primary key auto_increment,        name char(32),        age int,        book_id int,        foregin key(book_id) references book(id)        on update cascade        on delete cascade        );               以上方法关联方法错误,多对多时不能用这种路基思维去关联表,      注意:当两张表是多对多的关系时,就需要建立第三张表,用第三张表去分别关联另外两张表。      必须手动创建第三张表 用来专门记录两种表之间的关系              1,先建两张普通的表吗,不需要设置外键        create table book(         id int primary key auto_increment,         title char(32),         price int         );                create table author(         id int primary key auto_increment,         name char(32),         age int         );                 create table book2author(         id int primary key auto_increment,         book_id int,         foreign key(book_id) references book(id)         on update cascade         on delete cascade,         author_id int,         foreign key(author_id) references author(id)         on update cascade         on delete cascade         );                        insert into book(title,price) values('千禧金梅',10),('武则天',20),('西游记',30);                insert into author(name,age) values('展宇',17),('大炮',16),('火箭',58);                insert into book2author(book_id,author_id) values(1,1),(1,2),(2,1),(3,1),(3,2);           一对一:    外键字段建在任意一方都可以   但是推荐你建在查询频率较高的一方     # 左表的一条记录唯一对应右表的一条记录,反之也一样    create table deta(     id int primary key auto_increment,     phon int,     addr varchar(32)     );         create table author2(     id int primary key auto_increment,     name char(32),     age int,     deta_id int unique,    #该字段一定要是唯一的     foreign key(deta_id) references deta(id)  #外键的字段一定要保证unique     on update cascade     on delete cascade     );   

 

   # 三种外键关系都是用foreign key,区别在于如何使用以及其他条件限制即可做出三种关系      了解知识点:   复制表:    # 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 旧字段名 新字段名 新数据类型 [完整性约束条件…];      修改表:     # 查询语句执行的结果也是一张表,可以看成虚拟表     # 复制表结构+记录 (key不会复制: 主键、外键和索引)     create table new_service select * from service;     # 只复制表结构     select * from service where 1=2;        //条件为假,查不到任何记录     create table new1_service select * from service where 1=2;      create table t4 like employees; 

转载于:https://www.cnblogs.com/Fzhiyuan/p/11385801.html

最新回复(0)