1. 程式人生 > >2018.11.22

2018.11.22

垂直 需要 麻煩 mysql 關聯 int 語法 ima acc

將部門數據與員工數據放到同一張表中會造成
數據重復
結構混亂
擴展維護性差
需要分表

多對多創建外鍵
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語句導致數據庫被刪除 一般公司會用正則表達式阻止一些語句輸入

2018.11.22