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";
相关文章
相关标签/搜索