Python-多表關聯 外鍵 級聯

分表爲何分表多表關聯多表關係 ******    表之間的關係    爲何要分表    多對一        一個外鍵    多對多        一箇中間表 兩個外鍵    一對一        一個外鍵加一個惟一約束外鍵約束 ******    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";
相關文章
相關標籤/搜索