分表爲何分表多表關聯多表關係 ****** 表之間的關係 爲何要分表 多對一 一個外鍵 多對多 一箇中間表 兩個外鍵 一對一 一個外鍵加一個惟一約束外鍵約束 ****** foreign key(本身的字段) references 表名(對方的主鍵)級聯操做*** on update cascade on delete cascade2. 1.修改表 2.複製表 3.蠕蟲複製 sql注入攻擊----------------------------------------分表爲何分表,把全部數據都存放於一張表的弊端 一、表的組織結構複雜不清晰 二、浪費空間 三、擴展性極差多表關聯多表關係 ****** 表之間的關係 爲何要分表 1,多對一 (一個外鍵foreign key) 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)); 2,多對多 (一箇中間表 兩個外鍵foreign key) 兩張表之間是一個雙向的多對一關係,稱之爲多對多 如何實現? 須要一箇中間表 專門存儲關聯關係 老師和學生 一個老師能夠教多個學生 一個學生能夠被多個老師教 老師表和學生表 是多對多的關係 須要一箇中間表 專門存儲關聯關係 create table teacher(id int primary key auto_increment,name char(15)); create table student(id int primary key auto_increment,name char(15)); #中間表 create table tsr( 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 teacher values (1,"高跟"), (2,"矮跟"); insert into student values (1,"煒哥"), (2,"仨瘋"); # 插入對應關係 insert into tsr values (null,1,1), (null,1,2), (null,2,2); 3,一對一 (一個外鍵foreign key加一個惟一約束unique) 左表的一條記錄惟一對應右表的一條記錄,反之也同樣 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 stu( 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 ); insert into customer(name,qq,phone) values ('李飛機','31811231',13811341220), ('王大炮','123123123',15213146809), ('守榴彈','283818181',1867141331), ('吳坦克','283818181',1851143312), ('贏火箭','888818181',1861243314), ('戰地雷','112312312',18811431230) ; #增長學生 insert into stu(class_name,customer_id) values ('脫產3班',3), ('週末19期',4), ('週末19期',5) ;外鍵約束 ****** foreign key(本身的字段) references 表名(對方的主鍵) # foreign key會帶來什麼樣的效果? 約束1:在建立表時,先建被關聯的表dep,才能建關聯表emp 約束2:在插入記錄時,必須先插被關聯的表dep,才能插關聯表emp 約束3:在刪除記錄時,先刪除關聯的表的記錄,再被關聯的表的記錄 約束1:在建立表時,先建被關聯的表dep,才能建關聯表emp create table dep( id int primary key auto_increment, dep_name char(10), dep_comment char(60) ); create table emp( id int primary key auto_increment, name char(16), gender enum('male','female') not null default 'male', dep_id int, foreign key(dep_id) references dep(id) ); 約束2:在插入記錄時,必須先插被關聯的表dep,才能插關聯表emp insert into dep(dep_name,dep_comment) values ('sb教學部','sb輔導學生學習,教授python課程'), ('外交部','老男孩上海校區駐張江形象大使'), ('nb技術部','nb技術能力有限部門'); insert into emp(name,gender,dep_id) values ('alex','male',1), ('egon','male',2), ('lxx','male',1), ('wxx','male',1), ('wenzhou','female',3); 約束3:更新與刪除都須要考慮到關聯與被關聯的關係 解決方案: 一、先刪除關聯表emp,再刪除被關聯表dep,準備重建 mysql> drop table emp; Query OK, 0 rows affected (0.11 sec) mysql> drop table dep; Query OK, 0 rows affected (0.04 sec) 二、重建:新增功能,同步更新,同步刪除 create table dep( id int primary key auto_increment, dep_name char(10), dep_comment char(60) ); create table emp( id int primary key auto_increment, name char(16), gender enum('male','female') not null default 'male', dep_id int, foreign key(dep_id) references dep(id) on update cascade on delete cascade ); insert into dep(dep_name,dep_comment) values ('sb教學部','sb輔導學生學習,教授python課程'), ('外交部','老男孩上海校區駐張江形象大使'), ('nb技術部','nb技術能力有限部門'); insert into emp(name,gender,dep_id) values ('alex','male',1), ('egon','male',2), ('lxx','male',1), ('wxx','male',1), ('wenzhou','female',3); # 同步刪除 mysql> select * from dep; +----+------------------+------------------------------------------------------------------------------------------+ | id | dep_name | dep_comment | +----+------------------+------------------------------------------------------------------------------------------+ | 1 | sb教學部 | sb輔導學生學習,教授python課程 | | 2 | 外交部 | 老男孩上海校區駐張江形象大使 | | 3 | nb技術部 | nb技術能力有限部門 | +----+------------------+------------------------------------------------------------------------------------------+ 3 rows in set (0.00 sec) mysql> select * from emp; +----+------------------+--------+--------+ | id | name | gender | dep_id | +----+------------------+--------+--------+ | 1 | alex | male | 1 | | 2 | egon | male | 2 | | 3 | lxx | male | 1 | | 4 | wxx | male | 1 | | 5 | wenzhou | female | 3 | +----+------------------+--------+--------+ 5 rows in set (0.00 sec) mysql> delete from dep where id=1; Query OK, 1 row affected (0.02 sec) mysql> select * from dep; +----+------------------+------------------------------------------------------------------------------------------+ | id | dep_name | dep_comment | +----+------------------+------------------------------------------------------------------------------------------+ | 2 | 外交部 | 老男孩上海校區駐張江形象大使 | | 3 | nb技術部 | nb技術能力有限部門 | +----+------------------+------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec) mysql> select * from emp; +----+------------------+--------+--------+ | id | name | gender | dep_id | +----+------------------+--------+--------+ | 2 | egon | male | 2 | | 5 | wenzhou | female | 3 | +----+------------------+--------+--------+ 2 rows in set (0.00 sec) #同步更新 mysql> select * from emp; +----+------------------+--------+--------+ | id | name | gender | dep_id | +----+------------------+--------+--------+ | 2 | egon | male | 2 | | 5 | wenzhou | female | 3 | +----+------------------+--------+--------+ 2 rows in set (0.00 sec) mysql> update dep set id=200 where id =2; Query OK, 1 row affected (0.04 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from dep; +-----+------------------+------------------------------------------------------------------------------------------+ | id | dep_name | dep_comment | +-----+------------------+------------------------------------------------------------------------------------------+ | 3 | nb技術部 | nb技術能力有限部門 | | 200 | 外交部 | 老男孩上海校區駐張江形象大使 | +-----+------------------+------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec) mysql> select * from emp; +----+------------------+--------+--------+ | id | name | gender | dep_id | +----+------------------+--------+--------+ | 2 | egon | male | 200 | | 5 | wenzhou | female | 3 | +----+------------------+--------+--------+ 2 rows in set (0.00 sec)級聯操做*** on delete cascade 當主表刪除記錄時 從表相關聯的記錄同步刪除 on update cascade 當主表id更新時 從表相關聯的記錄同步更新 注意是單向的 主表變化是 級聯操做從表 從表的變化不會級聯到主表 create table emp( id int primary key auto_increment, name char(20), d_id int, foreign key(d_id) references dept(id) on delete cascade on update cascade );在平常開發中 若是性能要求賊高 不該該使用外鍵1.效率下降2.耦合 關係多起來後管理麻煩這時候 關係只是邏輯關係 頗有可能產生錯誤數據2. 1.修改表 add 添加字段 after|first after 添加字段到哪一個字段後面 first 添加字段到最前面 modify 修改字段類型 change 修改字段名稱 或 類型 drop 刪除字段 rename 改表名 2.複製表 create table 新的表名 select * from 源表名; 數據 結構 約束不能複製 當條件不成立是 只複製表結構 create table 新的表名 select * from 源表名 where 1 = 2; create table stu_copy2 select * from student1 where 1 = 2; 清空表 delete from tb1; 強調:上面的這條命令確實能夠將表裏的全部記錄都刪掉,但不會將id重置爲0, 因此收該條命令根本不是用來清空表的,delete是用來刪除表中某一些符合條件的記錄 delete from tb1 where id > 10; 若是要清空表,使用truncate tb1; 做用:將整張表重置 3.蠕蟲複製 自我複製 insert into 表名稱 select *from 表名; 若是有主鍵 避開主鍵字段 insert into 表名稱(其餘字段) select 其餘字段 from 表名; sql注入攻擊 一個瞭解sql語法的攻擊者 能夠在輸入框輸入sql語句 1255241708 123 select *from user where account = ":"drop database mysql" and pwd = "123";