约束
2018-09-13 本文已影响0人
knot98
1. 什么是约束
除了数据类型以外额外添加的约束
2. 为什么要使用约束
为了保证数据的合法性(mysql规则),完整性
3. 分类
not null
非空约束 数据不能为空
default
默认值约束
unique
唯一约束 该字段不能重复
unique 其实是一种索引
索引是一种数据结构 用于提高查询效率
可以为空
一张表中可以有多个唯一约束
单列唯一约束:
mysql> create table t12(`id card` char(18) unique);
mysql> desc t12;
+---------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+----------+------+-----+---------+-------+
| id card | char(18) | YES | UNI | NULL | |
+---------+----------+------+-----+---------+-------+
1 row in set (0.02 sec)
多列唯一约束:
mysql> create table t13(`id card` char(18),`phone number` char(11),unique(`id card`,`phone number`));
mysql> desc t13;
+--------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------+------+-----+---------+-------+
| id card | char(18) | YES | MUL | NULL | |
| phone number | char(11) | YES | | NULL | |
+--------------+----------+------+-----+---------+-------+
2 rows in set (0.01 sec)
primary key
主键约束:用于唯一标识表中一条数据(非空且唯一)
也就是说从约束的角度去看 主键约束 和 非空加唯一约束 没有区别
那它们之间的区别是什么?
唯一约束:是一种索引,必然存在于硬盘的某个文件中(物理存在)
primary key :是一种逻辑意义上的数据(实际上不存在,抽象概念)
换句话说主键就是由唯一约束与非空约束组成的约束
语法:
mysql> create table t14(
`student id` int primary key,
name char(10)
);
mysql> desc t14;
+------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+-------+
| student id | int(11) | NO | PRI | NULL | |
| name | char(10) | YES | | NULL | |
+------------+----------+------+-----+---------+-------+
2 rows in set (0.02 sec)
有无主键的区别?
1. 无法区分两个相同的数据,比如班级中有两个人名字相同
2. 有主键则以为着有索引,效率更高
3. 可以建立关联关系
多列联合主键:
mysql> create table t15(
`id card` char(18),
`phone number` char(11),
primary key(`id card`,`phone number`)
);
mysql> desc t15;
+--------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------+------+-----+---------+-------+
| id card | char(18) | NO | PRI | | |
| phone number | char(11) | NO | PRI | | |
+--------------+----------+------+-----+---------+-------+
2 rows in set (0.02 sec)
要不要主键??
必须的,每个表都应该有主键,哪怕不用唯一标识,也应该考虑提升效率
一般主键的字段都叫 id ,数据类型都用 int 类型
同一表中设置多个主键没有任何意义
小练习:
创建一个员工表 里面存储 员工编号 姓名 年龄 性别;
mysql> create table emp(
id int primary key,
name char(10) not null,
age int not null,
sex char(6) default 'male'
);
mysql> desc emp;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | char(10) | NO | | NULL | |
| age | int(11) | NO | | NULL | |
| sex | char(6) | YES | | male | |
+-------+----------+------+-----+---------+-------+
4 rows in set (0.02 sec)
mysql> insert into emp(id,name,age) values
(1,'杨总',60),
(2,'egon',59),
(3,'虎老师',58);
# 问题? 你很可能忘记上一次的id到多少了,导致你要先查看一下
# 麻烦,并且影响效率,所以有了auto_increment
mysql> select * from emp;
+----+-----------+-----+------+
| id | name | age | sex |
+----+-----------+-----+------+
| 1 | 杨总 | 60 | male |
| 2 | egon | 59 | male |
| 3 | 虎老师 | 58 | male |
+----+-----------+-----+------+
3 rows in set (0.00 sec)
auto_increment
自动增长
作用: 通常搭配主键字段使用,可以自动为你的数据分配主键
如何分配:
添加一条数据 主键(id)就自动加1,计数从1开始
语法:
mysql> create table t16(
id int primary key auto_increment,
name char(10)
);
mysql> desc t16;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(10) | YES | | NULL | |
+-------+----------+------+-----+---------+----------------+
2 rows in set (0.02 sec)
mysql> insert into t16(name) values
('yyh'),
('egon'),
('lxx');
mysql> select * from t16;
+----+------+
| id | name |
+----+------+
| 1 | yyh |
| 2 | egon |
| 3 | lxx |
+----+------+
3 rows in set (0.00 sec)
如果主键是自动增长 , 你可以跳过此字段,也可以插入null,都会自动增长
修改自动增长的起始位置:
alter table 表名 auto_increment = 值
注意:自动增长,只能用于整型,不能用于字符型
foreign(外键)