一、表与表之间建关系

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

二、外键(foreign key)

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

执行命令:

update dep set id=100 where id=2;

delete from dep where id=100;

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

三、修改表

mysql 对大小写不敏感
1.语法:
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;

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. 为什么要进行 URL 编码???

    作者:降瑞雪 cnblogs.com/jerrysion/p/5522673.html 我们都知道Http协议中参数的传输是"key=value"这种简直对形式的,如果要传多个参数 ...

  2. 装完某些软件之后IE主页被https://www.hao123.com/?tn=93453552_hao_pg劫持

    今天重装电脑,装完某些软件之后发现IE主页被https://www.hao123.com/?tn=93453552_hao_pg劫持,然后百度各种解决方法都没用,甚至是修改注册表依然没啥用 最后忽然看 ...

  3. LeetCode Array Easy169. Majority Element

    Description Given an array of size n, find the majority element. The majority element is the element ...

  4. Linux面试基础(一)

    Linux基本命令 man rm   查看命令帮助 tar cf 压缩文件 tar xf 解压缩 ping  查看是否能连接网络 rm           删除数据 find          搜索数 ...

  5. celery使用的小记录

    一篇还不错的入门说明: http://www.bjhee.com/celery.html, 官方文档: http://docs.jinkan.org/docs/celery/getting-start ...

  6. windows上测试网络数据跳转路径

    今天遇到一个有关路由方面的问题,所以向一位CCIE大神问了点问题.就是关于ip ping包出了pc之后怎么走的. 然后告诉我了这么一个命令: Tracert(跟踪路由)是路由跟踪实用程序,用于确定 I ...

  7. winform程序登陆后关闭登录窗体

    用winform做程序的时候,我们一般都是在Program先启动登录窗体,然后登录成功后才创建主窗体,结果这就导致了登录窗体无法关闭 所以如果我们不在Program的程序入口先创建登录窗体的话就能完美 ...

  8. Dubbox服务的消费方配置

    在src/main/resources下创建applicationContext-web.xml <?xml version="1.0" encoding="UTF ...

  9. 将中国标准时间)转化为yyyy-MM-dd

    有两种方法: 1. ]); ) + '-' + d.getDate() + ' ' + d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds ...

  10. MyBatis 传递多个参数的几种方法

      简介: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简 ...