2018.11.22

将部门数据与员工数据放到同一张表中会造成
数据重复
结构混乱
扩展维护性差
需要分表

多对多创建外键
create table 表名(字段名 类型(长度),foreign key(自己表里定义的要和另外一张表建立关系的关键字,字段名称) references 对方表名(对方主键名));
create table dept(id int primary key auto_increment,name char(20),job char(20));

create table emp(id int primary key auto_increment,name char(20),d_id int,foreign key(d_id) references dept(id));
外键的第一种约束 外键的第二个约束 外键的第三个约束
先建主表 先插入主表 删除记录时
再建从表 再插入从表 先删除从表记录, 再删主表记录

外键的第四个约束 外键的第五个约束 外键的第六个约束
从表更新外键时 更新主表的id时 删除主表时 要先删除从表
必须保证外键是存在的 必须先删除从表关联的数据 或者把关联数据 关联其他的主表id

第一种约束比喻.比如说要现有公司才可以招人,主表是被关联的表references dept(id) dept是主表 从表是foreign key(d_id) 是关联的表
第二种约束比喻比如说 现有了部门 才可以找人.
第三中约束比喻比如说要先把本部门里的人全部辞退才可以把部门去掉.
第四种约束比喻比如说员工要换到另一个部门,部门必须是存在的.
第五种约束和第三种类似, 第六种就是把所有人遣散再解散公司

级联使用可以让更新和删除变的更加的简单
有了这几个约束后 主表和从表中的数据必然是完整的
相应的收到外键约束 主表的删除 更新操作受到限制
很多情况下 我们就是要删除一个部门 然而需要至少两条sql语句 麻烦
可以使用级联
主表
create table dept(id int primary key auto_increment,name char(20),job char(20));

从表
create table t2(id int primary key auto_increment,name char(10),age int ,id_int int ,foreign key(id_int) references t1(id) on delete cascade on update cascade);

on delete cascade 当主表删除记录时 从表相关联的记录同步删除
on update cascade 当主表id更新时 从表相关联的记录同步更新
注意是单向的 主表变化是 级联操作从表 从表的变化不会级联到主表

多对多创建外键
老师和学生举例

create table teacher(id int primary key auto_increment,name char(15));
create table student(id int primary key auto_increment,name char(15));
insert into student values(null,"jt");
insert into student values(null,”yd");
insert into teacher values(null,"小黑");
insert into teacher values(null,"小白");
create table str(id int primary key auto_increment,t_id int ,s_id int,foreign key(t_id) references teacher(id) ,foreign key(s_id) references student(id));
insert into str values(null,1,1);
insert into str values(null,1,2);
insert into str values(null,2,1);

一对一 一个外键加一个唯一约束
一个客户只能产生一个学生
一个学生只能对应一个客户
当一个表这种字段太多 而常用字段不多时 可以采取垂直分表的方式来提高效率
姓名 性别 年龄
create table customer(c_id int primary key auto_increment,
name char(20),phonenum char(11),addr char(20));
身份证 地址 名族 身高 体重 血型 学历 政治面貌 联系方式

create table student1(s_id int primary key auto_increment,\

name char(20),class char(11),number char(20),housenum char(20),c_id int UNIQUE,foreign key(c_id) references customer(c_id));


复制表
create table 新的表名 select * from 源表名;
数据 ,结构 都可以复制, 约束不能复制
当条件不成立是 只复制表结构
create table 新的表名 select * from 源表名 where 1 = 2;
蠕虫复制
自我复制
insert into 表名称 select *from 表名;
insert into test select * from test;
如果有主键 避开主键字段
insert into 表名称(其他字段) select 其他字段 from 表名;
insert into t1(name) select name from t1;
sql注入攻击
一个了解sql语法的攻击者 可以在输入框输入
select *from user where account = ":"drop database mysql" and pwd = "123"; #让别人数据库执行sql语句导致数据库被删除 一般公司会用正则表达式阻止一些语句输入

posted @ 2018-11-21 19:53  涛仔··  阅读(151)  评论(0编辑  收藏  举报