一、表与表之间建关系

(1) 将所有的数据放在一张表内的弊端
  1. 表的组织结构不清晰
  2. 浪费存储时间
  3. 可扩展性极差
  4. ---> 类似于将所有的代码写入到一个py文件中 -->解耦部分
(2) 如何查找表之间的关系
  1. 以员工表和部门表为例:查找表关系需要做到换位思考
  2. (a) 先站在员工表的角度:
  3. 找员工表的多条数据能够对应部门表的一条数据
  4. =>多个员工能够属于同一个部门
  5. 可以,但不能直接下结论,还需要站在部门表的角度
  6. (b) 再站在部门表的角度:
  7. 找部门表的多条数据能够对应员工表的一条数据
  8. =>多个部门表的多条数据能否有同一个员工
  9. 不可以
  10. 只有站在两表的角度都分析过,才能够下结论:员工表单项多对一部门表

二、外键(foreign key)

1.必须要先建被关联表
  1. create table dep(
  2. id int primary key auto_increment,
  3. dep_name char(16),
  4. dep_desc char(64)
  5. );
  6. create table emp(
  7. id int primary key auto_increment,
  8. name char(16),
  9. gender enum('male','female','others') not null default 'male', # default后面的默认值空格直接书写即可
  10. dep_id int,
  11. foreign key(dep_id) references dep(id)
  12. );
2.插入数据
  1. 新增数据的时候,要先增被关联表中的数据
  1. insert into dep(dep_name,dep_desc) values
  2. ('外交部','形象代言人'),
  3. ('教学部','教书育人'),
  4. ('技术部','技术能力有限部门');
  1. """
  2. mysql> select * from dep;
  3. +----+-----------+--------------------------+
  4. | id | dep_name | dep_desc |
  5. +----+-----------+--------------------------+
  6. | 1 | 外交部 | 形象代言人 |
  7. | 2 | 教学部 | 教书育人 |
  8. | 3 | 技术部 | 技术能力有限部门 |
  9. +----+-----------+--------------------------+
  10. """
  11. insert into emp(name,gender,dep_id) values
  12. ('son','male',1),
  13. ('gon','male',2),
  14. ('vin','male',2),
  15. ('ank','male',2),
  16. ('rry','female',3);
  17. """
  18. | id | name | gender | dep_id |
  19. +----+------+--------+--------+
  20. | 1 | son | male | 1 |
  21. | 2 | gon | male | 2 |
  22. | 3 | vin | male | 2 |
  23. | 4 | ank | male | 2 |
  24. | 5 | rry | female | 3 |
  25. +----+------+--------+--------+
  26. 5 rows in set (0.00 sec)
  27. """
3.修改emp表中的dep_id字段
  1. update emp set dep_id=100 where id=1;
  2. update dep set id=100 where id=1;
  3. delete from dep where id=2;
  4. delete from emp where id>1 and id<5;
  5. delete from dep where id=2;
  6. """
  7. ERROR 1452 (23000): Cannot add or update a child row:
  8. a foreign key constraint fails (`day39`.`emp`,
  9. CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`dep_id`) REFERENCES `dep` (`id`))
  10. 上述语句都会报错,原因是 dmp 表设置了外键
  11. """
4. 给外键字段新增功能,同步更新删除(级联删除、级联更新)
  1. create table dep(
  2. id int primary key auto_increment,
  3. dep_name char(16),
  4. dep_desc char(64)
  5. );
  6. create table emp(
  7. id int primary key auto_increment,
  8. name char(16),
  9. gender enum('male','female','others') not null default 'male', # default后面的默认值空格直接书写即可
  10. dep_id int,
  11. foreign key(dep_id) references dep(id)
  12. on update cascade # 同步更新
  13. on delete cascade # 同步删除
  14. );
  15. insert into dep(dep_name,dep_desc) values
  16. ('外交部','形象代言人'),
  17. ('教学部','教书育人'),
  18. ('技术部','技术能力有限部门');
  19. insert into emp(name,gender,dep_id) values
  20. ('jason','male',1),
  21. ('egon','male',2),
  22. ('kevin','male',2),
  23. ('tank','male',2),
  24. ('jerry','female',3);
  1. """
  2. mysql> select * from emp;
  3. +----+-------+--------+--------+
  4. | id | name | gender | dep_id |
  5. +----+-------+--------+--------+
  6. | 1 | jason | male | 1 |
  7. | 2 | egon | male | 2 |
  8. | 3 | kevin | male | 2 |
  9. | 4 | tank | male | 2 |
  10. | 5 | jerry | female | 3 |
  11. +----+-------+--------+--------+
  12. 5 rows in set (0.00 sec)
  13. mysql> select * from dep;
  14. +----+-----------+--------------------------+
  15. | id | dep_name | dep_desc |
  16. +----+-----------+--------------------------+
  17. | 1 | 外交部 | 形象代言人 |
  18. | 2 | 教学部 | 教书育人 |
  19. | 3 | 技术部 | 技术能力有限部门 |
  20. +----+-----------+--------------------------+
  21. """

执行命令:

update dep set id=100 where id=2;

delete from dep where id=100;

  1. 结果:
  2. """
  3. mysql> select * from dep;
  4. +-----+-----------+--------------------------+
  5. | id | dep_name | dep_desc |
  6. +-----+-----------+--------------------------+
  7. | 1 | 外交部 | 形象代言人 |
  8. | 3 | 技术部 | 技术能力有限部门 |
  9. | 100 | 教学部 | 教书育人 |
  10. +-----+-----------+--------------------------+
  11. 3 rows in set (0.00 sec)
  12. mysql> select * from emp;
  13. +----+-------+--------+--------+
  14. | id | name | gender | dep_id |
  15. +----+-------+--------+--------+
  16. | 1 | jason | male | 1 |
  17. | 2 | egon | male | 100 |
  18. | 3 | kevin | male | 100 |
  19. | 4 | tank | male | 100 |
  20. | 5 | jerry | female | 3 |
  21. +----+-------+--------+--------+
  22. 5 rows in set (0.00 sec)
  23. """
  24. """
  25. mysql> select * from emp;
  26. +----+-------+--------+--------+
  27. | id | name | gender | dep_id |
  28. +----+-------+--------+--------+
  29. | 1 | jason | male | 1 |
  30. | 5 | jerry | female | 3 |
  31. +----+-------+--------+--------+
  32. 2 rows in set (0.00 sec)
  33. mysql> select * from dep;
  34. +----+-----------+--------------------------+
  35. | id | dep_name | dep_desc |
  36. +----+-----------+--------------------------+
  37. | 1 | 外交部 | 形象代言人 |
  38. | 3 | 技术部 | 技术能力有限部门 |
  39. +----+-----------+--------------------------+
  40. 2 rows in set (0.00 sec)
  41. """
5.多对多
  1. 图书与作者的例子
  2. 一本书可以有多个作者
  3. 一个作者可以写多本书
  4. 直接创建两个相互更新的表是不可以的,可以通过中间表来实现
  5. 即中间表建立两个表的对应关系,两个表内部可以完全不相关
  1. create table book(
  2. id int primary key auto_increment,
  3. title char(16),
  4. price int
  5. );
  6. create table author(
  7. id int primary key auto_increment,
  8. name char(16),
  9. gender char(16)
  10. );
  11. create table book2author(
  12. id int primary key auto_increment,
  13. book_id int,
  14. author_id int,
  15. foreign key(book_id) references book(id)
  16. on update cascade # 同步更新
  17. on delete cascade, # 同步删除
  18. foreign key(author_id) references author(id)
  19. on update cascade # 同步更新
  20. on delete cascade # 同步删除
  21. );
  22. insert into book(title,price) values
  23. ('活着','69.96'),
  24. ('围城','99.99'),
  25. ('python全栈开发','21000');
  26. insert into author(name,gender) values
  27. ('jason','male'),
  28. ('egon','female'),
  29. ('kevin','male');
  30. insert into book2author(book_id,author_id) values
  31. (1,1),
  32. (1,2),
  33. (1,3),
  34. (2,1),
  35. (2,3),
  36. (3,1),
  37. (3,2);
6.一对一关系
  1. 客户表和学生表(客户报名之后就成为了学生)
  1. create table customer(
  2. id int primary key auto_increment,
  3. name char(20) not null,
  4. qq char(10) not null,
  5. phone char(16) not null
  6. );
  7. create table student(
  8. id int primary key auto_increment,
  9. class_name char(20) not null,
  10. customer_id int unique, # 该字段一定要是唯一的
  11. foreign key (customer_id) references customer(id) # 外键的字段一定要保证unique
  12. on delete cascade
  13. on update cascade
  14. );
  15. # 三种外键关系都是用foreign key,区别在于如何使用以及其他条件限制即可做出三种关系

三、修改表

mysql 对大小写不敏感
1.语法:
  1. 1.修改表名
  2. ALTER TABLE 表名 RENAME 新表名;
  3. 2. 增加字段
  4. ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…], ADD 字段名 数据类型 [完整性约束条件…];
  5. ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST;
  6. ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名;
  7. 3. 删除字段
  8. ALTER TABLE 表名 DROP 字段名;
  9. 4. 修改字段 # modify只能改字段数据类型完整约束,不能改字段名,但是change可以!
  10. ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…];
  11. ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
  12. ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];

四、复制表

  1. # 查询语句执行的结果也是一张表,可以看成虚拟表
  2. # 复制表结构+记录 (key不会复制: 主键、外键和索引)
  3. create table new_service select * from service;
  4. # 只复制表结构
  5. select * from service where 1=2; //条件为假,查不到任何记录
  6. create table new1_service select * from service where 1=2;
  7. create table t4 like employees;

mysql数据库 --表操作的更多相关文章

  1. Database学习 - mysql 数据库 表操作

    mysql 数据库 表操作 创建数据表 基本语法格式: 创建数据表: create table 表名( 字段名 datatype 约束, 字段名 datatype 约束, ...... ) 修改表名 ...

  2. MySQL数据库-表操作-SQL语句(二)

    1. MySQL多表查询 1.1 外键约束 为了消除多张表查询出现的笛卡尔积的现象,MySQL在建表并进行多表之间的关键查询可以使用外键关联查询. 外键:从表1(sub)的某列引用(ref)另外一个表 ...

  3. MySQL数据库-表操作-SQL语句(一)

    1. 数据库操作与存储引擎 1.1   数据库和数据库对象 数据库对象:存储,管理和使用数据的不同结构形式,如:表.视图.存储过程.函数.触发器.事件等. 数据库:存储数据库对象的容器. 数据库分两种 ...

  4. MySQL数据库——表操作

    I.表操作 一.创建表 基本语法如下: create table 表名( 列名 类型 是否可以为空, 列名 类型 是否可以为空 )ENGINE=InnoDB DEFAULT CHARSET=utf8: ...

  5. Mysql 数据库表操作

    ☞ 创建表CREATE TABLE `数据库`.`表` ( `id` INT( 11 ) NOT NULL AUTO_INCREMENT COMMENT '注释',`type_name` VARCHA ...

  6. mysql数据库表操作-表的主键索引和普通索引

    数据库索引就象书的目录一样,如果在字段上建立了索引,那么以索引列为查询条件时可以加快查询数据的速度.查询数据库,按主键查询是最快的,每个表只能有一个主键列,但是可以有多个普通索引列,主键列要求列的所有 ...

  7. MySql数据库表操作(二)

    一.增加表记录: insert [into] tab_name (field1,field2....) values (values1,values2....) , (values1,values2. ...

  8. 第二百七十八节,MySQL数据库-表内容操作

    MySQL数据库-表内容操作 1.表内容增加 insert into 表 (列名,列名...) values (值,值,值...); 添加表内容添加一条数据 insert into 表 (列名,列名. ...

  9. 数据库 MySQL 之 表操作、存储引擎

    数据库 MySQL 之 表操作.存储引擎 浏览目录 创建(复制) 删除 修改 查询 存储引擎介绍 一.创建(复制) 1.语法: 1 2 3 4 5 CREATE TABLE 表名(     字段名1 ...

随机推荐

  1. css 实现水波纹,波浪动画效果

    <div class="wave"> 水波纹效果 <div class="wave1"></div> <div cla ...

  2. 整合mybatis时报错:Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/tx]

    org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Una ...

  3. createReadStream().pipe() Callback

    const stream = fs.createReadStream('<filepath>/example.pdf', {bufferSize: 64 * 1024}) stream.p ...

  4. python_django_上传文件

    存储路径: 存储在服务器的项目的static/upfile(你说了算的文件名,但是一般俺们叫这个)文件中 配置: 配置settings.py文件 MDEIA_ROOT = os.path.join(B ...

  5. mongodb的学习 (3)

    聚合函数 - 添加基础数据:db.local.save({contry:'中国',name:'小明',score:77});db.local.save({contry:'中国',name:'小红',s ...

  6. elasticsearch启动问题

    ES安装完一直启动不了,问题解决. 报错: ERROR: bootstrap checks failed system call filters failed to install; check th ...

  7. 64. 输出字节流(FileOutputStream)

    IO分类:    按照数据流向分类:        输入流                输出流        按照处理的单位划分:        字节流:字节流读取的都是文件中的二进制数据,读取到的 ...

  8. 如何在webpack中使用loader

    一.什么是loader loader 用于对模块的源代码进行转换.loader 可以使你在 import 或"加载"模块时预处理文件.因此,loader 类似于其他构建工具中“任务 ...

  9. SQL server 数据库安装

    一.安装 1.点击setup双击 2.选择第一条-安装一个新的SQLserver 3.一路点击next 4.product Key-选择第一个:试用版 5.setup Role-选择所有 6.sell ...

  10. 通用shellcode代码

    #include <stdio.h>#include <windows.h> int main(){ __asm { CLD //清空标志位DF push 0x1E380A6A ...