mysql 数据库之表操作

一、表与表之间建关系
(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;

转载于:https://www.cnblogs.com/wangtenghui/p/10940868.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值