外键约束笔记

<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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值