<pre>
|-----回忆一下已经讲过的约束条件?
主键约束: primary key
唯一约束: unique
非空约束: not null
检查性约束: check(条件)
默认约束: default 默认值
|-----创建一张学生表,含有id(主键,自增长),name(唯一),age(大于18小于60),sex(默认为男),班级
创建一张班级表,含有id(主键,自增长),班名.
create table student(
id int primary key auto_increment,
name varchar(20) unique,
age int check(age>18 and age<60),
sex char(2) default '男',
class int
);
create table class(
id int primary key auto_increment,
className varchar(10)
);
mysql> desc student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | UNI | NULL | |
| age | int(11) | YES | | NULL | |
| sex | char(2) | YES | | 男 | |
| class | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
5 rows in set (0.08 sec)
mysql> desc class;
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| className | varchar(10) | YES | | NULL | |
+-----------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
insert into student(name,age,sex,class) values('张三',23,'男',1);
insert into student(name,age,sex,class) values('李四',23,'男',1);
insert into student(name,age,sex,class) values('王五',23,'男',2);
insert into student(name,age,sex,class) values('赵六',23,'男',2);
insert into student(name,age,sex,class) values('田七',23,'男',3);
insert into class (className) values('一一班');
insert into class (className) values('一二班');
insert into class (className) values('一三班');
mysql> select * from student;
+----+------+------+------+-------+
| id | name | age | sex | class |
+----+------+------+------+-------+
| 1 | 张三 | 23 | 男 | 1 |
| 2 | 李四 | 23 | 男 | 1 |
| 3 | 王五 | 23 | 男 | 2 |
| 4 | 赵六 | 23 | 男 | 2 |
| 5 | 田七 | 23 | 男 | 3 |
+----+------+------+------+-------+
5 rows in set (0.00 sec)
mysql> select * from class;
+----+-----------+
| id | className |
+----+-----------+
| 1 | 一一班 |
| 2 | 一二班 |
| 3 | 一三班 |
+----+-----------+
3 rows in set (0.00 sec)
查询每个学生属于哪个班?
mysql> select student.id,name,sex,age,className from class,student where class=class.id;
+----+------+------+------+-----------+
| id | name | sex | age | className |
+----+------+------+------+-----------+
| 1 | 张三 | 男 | 23 | 一一班 |
| 2 | 李四 | 男 | 23 | 一一班 |
| 3 | 王五 | 男 | 23 | 一二班 |
| 4 | 赵六 | 男 | 23 | 一二班 |
| 5 | 田七 | 男 | 23 | 一三班 |
+----+------+------+------+-----------+
新来了一个学生,请班长将学生添加到学生表,请问该学生可以是哪些班的?
insert into student(name,age,sex,class) values('小三',23,'男',5);
|----什么是外键?主表?从表?外键字段?
外键: 当前字段的值不能自己决定,必须引用其他表中的字段的值
从表: 含有外键字段的表称为从表[外键字段数据引用其他表]
主表: 被引用数据的表,称为主表
外键字段: 使用外键约束的字段,称为外键字段
|---创建外键的条件?
创建外键的条件:
1.外键字段的类型必须和被引用字段的类型相同
2.被引用字段要么含有主键约束,要么含有唯一约束.(这个条件容易被忽略)
附加条件:
若建表并添加数据,此时添加外键约束.那么要求外键字段中的数据,在被引用字段中都存在.
| ---添加外键的方式?
重点:
foreign key(class) references class(id);
外键 (从表字段) 引用 主表名(主表中被引用的字段);
注意:这个约束匿名你不设置,他也会自己创建
删除的时候需要查约束名
语句:show create table 表名;
建表后添加外键约束:
alter table 从表名 add [constraint 约束匿名] foreign key(外键字段名) references 主表名(被引用字段名);
alter table student add foreign key(class) references class(id);
CREATE TABLE 表名(
字段名 字段类型 约束,
.....,
[CONSTRAINT 约束匿名] foreign key(外键字段名) references 主表名(被引用字段名)
)
mysql> desc student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | UNI | NULL | |
| age | int(11) | YES | | NULL | |
| sex | char(2) | YES | | 男 | |
| class | int(11) | YES | MUL | NULL | |
+-------+-------------+------+-----+---------+----------------+
mysql> desc class;
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| className | varchar(10) | YES | | NULL | |
+-----------+-------------+------+-----+---------+----------------+
|---添加外键的作用?
统一性 完整性 安全性
|---删除外键的方式? MUL残留问题?
提醒:添加约束的时候,字段通常要加上括号"()",删除约束的时候,通常不能添加括号"()".
MUL其实就是索引,删除约束,索引不会自动删除,必须手动删除
手动删除语句:
删除索引:
alter table 表名 drop index 索引匿名;
删除约束语句:
alter table 从表名 drop foreign key 约束匿名;
alter table student drop foreign key student_ibfk_1;
查看约束匿名:
show create table 表名;
|---删除表的步骤?
第一种: 先删除从表[外键消息],然后删除主表---有依赖关系(被引用),不可以删除的
第二种: 先删除外键约束,然后随意删除表
问题: 一个表中可以有几个外键?
N个
<pre>
外键约束笔记
最新推荐文章于 2022-02-18 22:04:48 发布