MySQL (3)

MySQL(三)--约束

知识点一:约束

约束可以理解为限制,生而为人 就会有道德约束和法律约束 等等约束 也就是限制同样我们数据得有约束才能让其更加高效更加完美

default 默认约束

show create table t1

create table t1 (id int default 110,name varchar(10));
  #default 110:
+-------+-------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id   | int(11)     | YES |     | 110     |       |
| name | varchar(10) | YES |     | NULL   |       |
+-------+-------------+------+-----+---------+-------+
insert into t1(name) values('zhangwuji');#不传约束的那个参数的话,就自动会传已经约束好的
+------+-----------+
| id   | name     |
+------+-----------+
|  110 | zhangwuji |
+------+-----------+
insert into t1(id,name) value('22','zhouzhiruo');
+------+------------+
| id   | name       |
+------+------------+
|  110 | zhangwuji |
|   22 | zhouzhiruo |
+------+------------+
#你给传了的话就先紧你来

not null 非空约束

数据不能为空

create table t2(id int not null,name varchar(20));

insert into t2 value(1,'zhangwuji'); # ok
+----+-----------+
| id | name     |
+----+-----------+
|  1 | zhangwuji |
+----+-----------+

insert into t2 (id) value(2); # ok
+----+-----------+
| id | name     |
+----+-----------+
|  1 | zhangwuji |
|  2 | NULL     |
+----+-----------+

insert into t2(name) value('zhouzhiruo'); # 报错
ERROR 1364 (HY000): Field 'id' doesn't have a default value
你指定非空约束,插数据就必须给值,否则会报错

unique key 唯一约束

create table t3(id int unique key,name varchar(20) not null);
+-------+-------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id   | int(11)     | YES | UNI | NULL   |       |
| name | varchar(20) | NO   |     | NULL   |       |
+-------+-------------+------+-----+---------+-------+

第一次输入insert into t3 value(1, 'xiaoming');  
+------+----------+
| id   | name     |
+------+----------+
|    1 | xiaoming |
+------+----------+
第二次输入insert into t3 value(1, 'qqq');
ERROR 1062 (23000): Duplicate entry '1' for key 'id'
#也就是说,设置了以后,第一次传入一个值,以后不会有重复的
非空且唯一,第一个非空且唯一的字段会默认为主键(没设置主键)

primary key 主键约束

#主键约束就是非空和唯一的组合体
create table t4(id int primary key,name varchar(20) not null unique key);

insert into t4(id,name) values(1,'yy'); # 创建成功

insert into t4(id,name) values(null,'qiye'); # 报错
ERROR 1048 (23000):Column 'id' cannot be null

insert into t4(id,name) values(1,'aa'); #报错
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

如果一个表格里没有设置主键约束,并且其中有一个字段既有唯一约束,又有非空约束,那么会自动推荐它成为主键约束,你没指定主键,它会自己找一个,但你去查的时候并不是主键约束,还是非空约束和唯一约束

auto_increment 自增长约束

# 这个玩意儿需要和主键配合使用
create table t5(id int primary key auto_increment,name varchar(20));

insert into tb5(name) values('xiaowang'),('xiaoxin'); #一直增长
+----+----------+
| id | name     |
+----+----------+
|  1 | xiaowang |
|  2 | xiaoxin |
+----+----------+
+----+----------+
| id | name     |
+----+----------+
|  1 | xiaowang |
|  2 | xiaoxin |
|  3 | xiaowang |
|  4 | xiaoxin |
|  5 | xiaowang |
|  6 | xiaoxin |
|  7 | xiaowang |
|  8 | xiaoxin |
|  9 | xiaowang |
| 10 | xiaoxin |
| 11 | xiaowang |
| 12 | xiaoxin |
| 13 | xiaowang |
| 14 | xiaoxin |
+----+----------+

create table tb5(id int primary key auto_increment,name varchar(20) not null)auto_increment=100;   #从100开始自增

create table tb5(id int primary key auto_increment,name varchar(20) not null)auto_increment=6;
+----+----------+
| id | name     |
+----+----------+
|  6 | xiaowang |
|  7 | xiaoxin |
|  8 | xiaowang |
|  9 | xiaoxin |
| 10 | xiaowang |
| 11 | xiaoxin |
| 12 | xiaowang |
| 13 | xiaoxin |
| 14 | xiaowang |
| 15 | xiaoxin |
+----+----------+

foreign key 外键约束

表与表之间产生联系

表与表发生关系  都是通过外键约束

E--R 模型   e 实体 r 关系

外键关联到另外一张表的主键上

create table a(a_id int primary key auto_increment,a_name varchar(20) not null);

create table b(b_id int primary key,b_name varchar(20) not null,fy_id int not null,foreign key(fy_id) references a(a_id));
#fy_id是自己起的
外键是相对而言的,意思就是说 他是哪张表的外键
#必须先添加主体表,也就是a里面的数据,先添加参考表b的话会报错
insert into a values(1,'qiye');
insert into a values(2,'baye');

insert into b values (11,'a1',3),(22,'a2',4);  # 报错,因为a表中没有3和4
 
insert into b values (11,'a1',1),(22,'a2',1);  #可以
+------+--------+-------+
| b_id | b_name | fy_id |
+------+--------+-------+
|    1 | a1     |     1 |
|    2 | a2     |     2 |
|   11 | a1     |     1 |
|   22 | a2     |     1 |
+------+--------+-------+

insert into b values (10,'a1',1),(23,'a2',2);  #可以
+------+--------+-------+
| b_id | b_name | fy_id |
+------+--------+-------+
|    1 | a1     |     1 |
|    2 | a2     |     2 |
|   10 | a1     |     1 |
|   11 | a1     |     1 |
|   22 | a2     |     1 |
|   23 | a2     |     2 |
+------+--------+-------+

insert into a values(3,'a3');
a   b
1    2
2        #关联表的全部主表必须有,主表有的关联表可以没有,一般是关联主键的,因为           主键非空且唯一
a:被关联的表 a_id
b:外键表 关联的字段:fy_id

insert into a values (4,'qq');
# 我们的外键是fy_id 所以其他的不同没有关系

#####关联以后,主表是删不掉的,因为它有外键关联,关联表可以随意删除,如果想删主表,必须先把他的外键关联关系删干净了才能删的掉,如果没删干净关联关系就删除主表的话会报错

知识点二:表关系

1、一对一

学生表 姓名,学号,学院等基本信息
学生详情表 学号 阶段,住址,联系方式等详细信息
一对一 用外键的方式关联
学生表中的学生只对应详情表的一条数据
create table student(id int primary key,name varchar(10));

create table stu_detail(s_id int primary key,age int,sex char(5),foreign key(s_id) references student(id));

2、一对多

多个学生表对应一个学院表

3、多对多

学生选课    课程对多个学生   学生对多个课程
需要创建中间表 有 两个字段(学生编号,课程编号)
课程表有两个字段(课程编号,课程名字)
主键加主键来实现的(联合主键)
学生编号 课程
0     python ok
1     java   ok
2     c++     ok
0     java   OK
0     python 不行
#可以选择多个,但是不能重复选择一个

一定要有中间表来存放他们的关系

create table course(course_id int primary key auto_increment,course_name varchar(20) not null);

create table student(s_id int primary key auto_increment,s_name varchar(20) not null);

create table zhongjian(s_id int,course_id int,primary key(s_id,course_id),foreign key(s_id) references student(s_id),
foreign key(course_id) references course(course_id));

insert into course values(1,'python'),(2,'java'),(3,'c++');
+-----------+-------------+
| course_id | course_name |
+-----------+-------------+
|         1 | python     |
|         2 | java       |
|         3 | c++         |
+-----------+-------------+

insert into student values(1,'qiye'),(2,'aaa');
+------+--------+
| s_id | s_name |
+------+--------+
|    1 | qiye   |
|    2 | aaa   |
+------+--------+

insert into zhongjian values(3,1)  #不行,因为student里没有3

insert into zhongjian values(2,1);
insert into zhongjian values(1,2);
insert into zhongjian values(2,2);
insert into zhongjian values(2,3);
select * from zhongjian;    # s_id,course_id都是主键,这叫联合主键
+------+-----------+
| s_id | course_id |
+------+-----------+
|    2 |         1 |
|    1 |         2 |
|    2 |         2 |
|    2 |         3 |
+------+-----------+

 

posted on 2022-03-05 15:27  请你一定要记得我好吗  阅读(91)  评论(0)    收藏  举报