MySQL (3)
MySQL(三)--约束知识点一:约束default 默认约束not null 非空约束unique key 唯一约束 primary key 主键约束auto_increment 自增长约束foreign key 外键约束知识点二:表关系1、一对一2、一对多3、多对多
知识点一:约束
约束可以理解为限制,生而为人 就会有道德约束和法律约束 等等约束 也就是限制同样我们数据得有约束才能让其更加高效更加完美
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 |
+------+-----------+
浙公网安备 33010602011771号