A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

10.6 约束条件10.61 not null 、default[url=][/url]
create table t15(    id int,    name char(16) not null,    sex enum('male','female','other') not null default "male");#alter table t15 modify name char(16) not null;insert into t15(id,name) values(1,'egon1'),(2,'egon2'),(3,'egon3');​mysql> desc t15;+-------+-------------------------------+------+-----+---------+-------+| Field | Type                          | Null | Key | Default | Extra |+-------+-------------------------------+------+-----+---------+-------+| id    | int(11)                       | YES  |     | NULL    |       || name  | char(16)                      | NO   |     | NULL    |       || sex   | enum('male','female','other') | NO   |     | male    |       |+-------+-------------------------------+------+-----+---------+-------+​mysql> select * from t15;+------+-------+------+| id   | name  | sex  |+------+-------+------+|    1 | egon1 | male ||    2 | egon2 | male ||    3 | egon3 | male |+------+-------+------+[url=][/url]

10.62 unique
mysql中存在一种专门的数据结构,叫 key,又称为索引,通过该数据结构可以减少 i/o 次数,从而加速查询效率 index key : 只有加速查询的效果,没有约束的功能 unique key:不仅有加速查询的效果,还附加了一种约束的功能 primary key:不仅有加速查询的效果,还附加了一种约束的功能,并且innodb存储引擎会按照主键字段的值 来组织表中所有的数据,所以一种inndob表中必须有、而且只能有一个主键,通常为该表的id字段
unique:限制字段的值的唯一性,单从约束角度去看:唯一性约束
[url=][/url]
#单列唯一create table t16(    id int unique,    name char(16));​# 联合唯一(不能完全相同)create table server(    id int unique,    ip char(15),    port int,    unique(ip,port));mysql> desc server;+-------+----------+------+-----+---------+-------+| Field | Type     | Null | Key | Default | Extra |+-------+----------+------+-----+---------+-------+| id    | int(11)  | YES  | UNI | NULL    |       || ip    | char(15) | YES  | MUL | NULL    |       || port  | int(11)  | YES  |     | NULL    |       |+-------+----------+------+-----+---------+-------+insert into server values(1,'1.1.1.1',3306),(2,'1.1.1.1',3307),(3,'1.1.1.2',3306);mysql> select * from server;+------+---------+------+| id   | ip      | port |+------+---------+------+|    1 | 1.1.1.1 | 3306 ||    2 | 1.1.1.1 | 3307 ||    3 | 1.1.1.2 | 3306 |+------+---------+------+[url=][/url]

10.63 primary key
primary key:单单从约束角度去看,primary key就等同于 not null + unique 强调: 1、一张表中必须有,并且只能有一个主键2、一张表中都应该有一个id字段,而且应该把id字段做成主键
[url=][/url]
create table t17(    id int primary key,    name char(16),    age int,    sex char(6))engine=innodb;​​#联合主键(不完全相同,但不能为空)create table t19(    ip char(15),    port int,    primary key(ip,port));mysql> desc t19;+-------+----------+------+-----+---------+-------+| Field | Type     | Null | Key | Default | Extra |+-------+----------+------+-----+---------+-------+| ip    | char(15) | NO   | PRI |         |       || port  | int(11)  | NO   | PRI | 0       |       |+-------+----------+------+-----+---------+-------+[url=][/url]

10.64 auto_increment
只能给被约束成key的字段加自增属性,默认起始位置是1,步长也为1
[url=][/url]
# primary key auto_incrementcreate table t20(    id int primary key auto_increment,    name char(16))engine=innodb;​mysql> insert t20(name) values('egon1');mysql> insert t20(name) values('egon2');mysql> select * from t20;+----+-------+| id | name  |+----+-------+|  1 | egon1 ||  2 | egon2 |+----+-------+[url=][/url]

10.7 表关系10.71 多对一(foreign key)
1、把所有数据都存放于一张表的弊端:
  • 表的组织结构复杂不清晰
  • 浪费空间
  • 扩展性极差
    2、寻找表与表之间的关系的方法: 举例:emp表 dep表 步骤一: part1: 1、先站在左表emp的角度 2、去找左表emp的多条记录能否对应右表dep的一条记录
    part2: ​ 1、站在右表dep的角度 2、去找右表dep的多条记录能否对应左表emp的一条记录 3、如何实现? 在emp表中新增一个dep_id字段,该字段指向dep表的id字段
    4、foreign key会带来什么样的效果?


约束1:在创建表时,先建被关联的表dep,才能建关联表emp
[url=][/url]
create table dep(    id int primary key auto_increment,    dep_name char(10),    dep_comment char(60));mysql> desc dep;+-------------+----------+------+-----+---------+----------------+| Field       | Type     | Null | Key | Default | Extra          |+-------------+----------+------+-----+---------+----------------+| id          | int(11)  | NO   | PRI | NULL    | auto_increment || dep_name    | char(10) | YES  |     | NULL    |                || dep_comment | char(60) | YES  |     | NULL    |                |+-------------+----------+------+-----+---------+----------------+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));mysql> desc emp;+--------+-----------------------+------+-----+---------+----------------+| Field  | Type                  | Null | Key | Default | Extra          |+--------+-----------------------+------+-----+---------+----------------+| id     | int(11)               | NO   | PRI | NULL    | auto_increment || name   | char(16)              | YES  |     | NULL    |                || gender | enum('male','female') | NO   |     | male    |                || dep_id | int(11)               | YES  | MUL | NULL    |                |+--------+-----------------------+------+-----+---------+----------------+[url=][/url]

约束2:在插入记录时,必须先插被关联的表dep,才能插关联表emp
[url=][/url]
insert into dep(dep_name,dep_comment) values('sb教学部','sb辅导学生学习,教授python课程'),('外交部','形象大使'),('nb技术部','nb技术能力有限部门');mysql> select * from dep;+----+-------------+-------------------------------------------+| id | dep_name    | dep_comment                               |+----+-------------+-------------------------------------------+|  1 | sb教学部    | sb辅导学生学习,教授python课程            ||  2 | 外交部      | 形象大使                                  ||  3 | 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 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 |+----+---------+--------+--------+[url=][/url]

约束3:更新与删除都需要考虑到关联与被关联的关系(不能直接改变dep表的id)解决方案:
View Code
10.72 多对多(foreign key)
1、什么是多对多 两张表之间是一个双向的多对一关系,称之为多对多 2、如何实现? 建立第三张表,该表中有一个字段是fk左表的id,还有一个字段是fk右表的id
[url=][/url]
create table author(    id int primary key auto_increment,    name char(16));create table book(    id int primary key auto_increment,    bname char(16),    price int);insert into author(name) values('egon'),('alex'),('wxx');mysql> select * from author;+----+------+| id | name |+----+------+|  1 | egon ||  2 | alex ||  3 | wxx  |+----+------+insert into book(bname,price) values('python从入门到入土',200),('葵花宝典切割到精通',800),('九阴真经',500),('九阳神功',100);mysql> select * from book;+----+-----------------------------+-------+| id | bname                       | price |+----+-----------------------------+-------+|  1 | python从入门到入土          |   200 ||  2 | 葵花宝典切割到精通           |   800 ||  3 | 九阴真经                    |   500 ||  4 | 九阳神功                    |   100 |+----+-----------------------------+-------+create table author2book(    id int primary key auto_increment,    author_id int,    book_id int,    foreign key(author_id) references author(id) on update cascade on delete cascade,    foreign key(book_id) references book(id) on update cascade on delete cascade);insert into author2book(author_id,book_id) values(1,3),(1,4),(2,2),(2,4),(3,1),(3,2),(3,3),(3,4);mysql> select * from author2book;+----+-----------+---------+| id | author_id | book_id |+----+-----------+---------+|  1 |         1 |       3 ||  2 |         1 |       4 ||  3 |         2 |       2 ||  4 |         2 |       4 ||  5 |         3 |       1 ||  6 |         3 |       2 ||  7 |         3 |       3 ||  8 |         3 |       4 |+----+-----------+---------+[url=][/url]

10.73 一对一(unique+foreign key)[url=][/url]
一对一:左表的一条记录唯一对应右表的一条记录,反之也一样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 student(    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);mysql> select * from customer;+----+-----------+-----------+-------------+| id | name      | qq        | phone       |+----+-----------+-----------+-------------+|  1 | 李飞机    | 31811231  | 13811341220 ||  2 | 王大炮    | 123123123 | 15213146809 ||  3 | 守榴弹    | 283818181 | 1867141331  ||  4 | 吴坦克    | 283818181 | 1851143312  ||  5 | 赢火箭    | 888818181 | 1861243314  ||  6 | 战地雷    | 112312312 | 18811431230 |+----+-----------+-----------+-------------+insert into student(class_name,customer_id) values('python',3),('java',4),('c++',5);mysql> select * from student;+----+-------------+-------------+| id | class_name  | customer_id |+----+-------------+-------------+|  1 | python     |           3 ||  2 | java       |           4 ||  3 | c++        |           5 |+----+-------------+-------------+[url=][/url]











2 个回复

倒序浏览
有任何问题欢迎在评论区留言
回复 使用道具 举报
或者添加学姐微信
DKA-2018
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马