这篇博客记录一下我学习创建约束的过程。
总结一下知识点,还有排雷。
首项,要明白几个概念:
约束:
主键约束、外键约束、自增约束、唯一约束、非空约束
下篇介绍设计范式、表的查询
一、 主键约束:
这个字段能唯一确定表中的一条记录。比如说,有张学生信息表,有字段id,每个学生都有自己特有的id,不重复,不为空。通过id能映射有且仅有一个学生这个id就是主键。
创建主键约束:create table 表名(字段 类型 primary key,下个字段等等);
这个主键字段传值的时候是不能传重复或者null的,不然会报错。
create table stu(id int ,name char,class int,primary key(id,name));
//联合主键,只要这连个加起来的内容不重复、不为空就可
mysql> create table stu(id int primary key,name char,class int);
mysql> desc stu;
+-------+---------+------+-----+---------+-------+
| Field |Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | | //(有个标记PRI)
| name | char(1) | YES | |NULL | |
| class|int | YES | |NULL | |
+-------+---------+------+-----+---------+-------+
3 rows in set
(0.12 sec)
*****这几个的意思分别是
Field 字段|Type字段类型 | Null是否允许为空 | Key有没有键 | Default有没有默认值 | Extra 备注
字段|类型|空|键|默认|额外
1。删除主键:
alter table 表名 drop primary key ; //因为一张表只能有一个主键,所以不用指定删哪个字段的主键
mysql> alter table stu drop primary key;
mysql> desc
stu;
+-------+---------+------+-----+---------+-------+
| Field |Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | char(1) | YES | |NULL | |
| class |int | YES | |NULL | |
+-------+---------+------+-----+---------+-------+
//你发现了什么没有,删完了主键它的null规定那里居然是NO。
**注意:这个被我们定义了主键又删除的字段是不能传空值null的
二、自增约束:
顾名思义就是自己加东西,如果你没有给他传参的话。举个栗子,有两个字段,一个是 class(自增约束),一个是name,当我传name值而不传class值的时候,它就会自动帮我加上一个class
一个表只能有一个自增列
自增列必须是整型的
自增列必须是键列,例如:主键,唯一键
自增的三种方法:
insert into stu (id,name) values(1,‘A’);
insert into stu values(1,‘A’,null);
insert into stu (id,name) values(1,‘A’,0);
还是用这个stu表,我用修改约束的方法,把class改为自增约束。
1。修改约束:
alter table stu modify class int primary key auto_increment;
这一条字段的属性就变成了:
| class | int | NO | PRI | NULL | auto_increment |
mysql>
insert into stu values(1,'A');
//如果这样没有指定的传参是会报错的
ERROR 1136 (21S01): Column count doesn't match value count at row 1
//可以传null进去
mysql>
insert into stu (id,name) values(1,'A');
Query
OK, 1 row affected (0.26 sec)
mysql>select * from stu;
+----+------+-------+
| id |name | class |
+----+------+-------+
| 1 | A | 1 |
+----+------+-------+
三、唯一约束:
可以这样理解,唯一约束就是可以传空值的主键。唯一约束的原则就是不能有重复的记录
一山容不得二虎,除非是一公一母,也可以没有老虎。
create table shan(laohu int,sex char unique);
//同样这里也可以像主键的格式一样写成联合唯一约束。
create table shan(laohu int,sex char, unique(laohu,sex));
mysql> create table shan(laohu int,sex char unique);
Query OK, 0 rows affected (0.52 sec)
mysql> desc shan;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| laohu | int | YES | | NULL | |
| sex | char(1) | YES | UNI | NULL | |
+-------+---------+------+-----+---------+-------+
mysql> insert into shan values(1,'x');
mysql> insert into shan values(1,'x');
//当我输入2次x给sex(唯一约束)时就会报错
ERROR 1062 (23000): Duplicate entry 'x' for key 'shan.sex'
四、非空约束:
非空约束跟唯一约束组合起来就是主键约束,所以非空约束就是不能是空值。
create table student (TEL int not null,class,int);
//字段TLE电话就是不能是空的,不给联系方式不让走
mysql> create table student(TEL int not null,class int);
Query OK, 0 rows affected (0.80 sec)
mysql> desc student ;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra|
+-------+------+------+-----+---------+-------+
| TEL | int | NO | | NULL | |
| class | int | YES | | NULL | |
+-------+------+------+-----+---------+-------+
//这里的NULL是NO
五、默认约束:
传数据到字段中,如果没有数据,就默认给个值
create table teacher(age int default 40,id int);
mysql> insert into teacher values(null,1);
Query OK, 1 row affected (0.15 sec)
mysql> insert into teacher (id) values(2);
Query OK, 1 row affected (0.14 sec)
mysql> select*from teacher;
+------+------+
| age |id |
+------+------+
| NULL | 1 |
| 40| 2 |
+------+------+
2 rows in set (0.00 sec)
//传入了两条数据
六、外键约束:
这个就关于到多个表了。
假如有两个表,student、class,外键是student表的一个字段,不是主键,但 是class表的主键。
student表里有个字段叫班级,设置成外键,在class就有班级号(主键)与之对应。
mysql> create table student(class_id int,id int);
Query OK, 0 rows affected (0.97 sec)
mysql> create table class(id int primary key, name varchar(20),foreign key(class_id)references class(id));
ERROR 1072 (42000): Key column 'class_id' doesn't exist in table
//要搞清楚顺序,得先创建主键
mysql> create table class(id int primary key, name varchar(20));
Query OK, 0 rows affected (0.57 sec)
mysql> create table student(class_id int,id int ,foreign key(class_id)references class(id));
Query OK, 0 rows affected (0.77 sec)
//这样两个表就关联了起来
student不能增加class没有的班级号,而class也不能删除有学生的班级号
这是一个双向制约的关系
本来想跟范式一起写了,但是有点长,可能会影响日后的阅读体验,所以范式在下篇写入。