约束是作用于表中列上的规则,用于限制加入表的数据,约束的存在保证了数据库中数据的正确性、有效性和完整性。
primary key (主键)约束
用于唯一的标识表行的数据,当定义主键约束后,该列不能重复
字段名 字段类型 primary key
注意:
1.primary key 不能重复而且不能为null
2.一张表最多只能有一个主键,但可以是复合主键
primary key (列1,列2)
3.主键的指定方式有两种
直接在字段名后指定:字段名 primary key
在表定义最后写primary key(列名)
4.使用desc 表名, 可以看到primary key 的情况
5.在实际开发中,每个表往往都会设计一个主键
not null (非空)约束
如果在列上定义了not null,那么当插入数据时,必须为列提供数据
字段名 字段类型 not null
unique(唯一)约束
当定义了唯一约束后,该列值是不能重复的。
字段名 字段类型 unique
注意:
1.如果没有指定 not null ,则unique字段可以有多个null
2.一张表可以有多个unique 字段
foreign key(外键)约束
外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性。
用于定义主表和从表之间的关系:外键约束要定义在从表上,主表则必须具有主键约束或是unique约束,当定义外键约束后,要求外键列数据必须在主表的之间列存在或是为null。
创建表时添加外键约束:
create table 表名 (列名 数据类型 ....)
[constraint] [外键名称] foreign key (本表列名) references 主表名(主键名或unique字段名)
建完表后删除外键约束:
alter table 表名 drop foreign key 外键名称
一对多实现方式:
在多的一方建立外键,关联一方主键
多对多实现方式:
建立第三张中间表,中间至少包含2个外键,分别关联双方主键
一对一实现方式:
在任意一方建立外键,关联对方主键,并设置外键唯一
注意:
1.外键指向的表的字段,要求是primary key 或者是unique
2.表的类型是引擎 innodb,这样的表才支持外键
3.外键字段的类型要和主键字段的类型一致(长度可以不同)
4.外键字段的值,必须在主键字段中出现过,或者为null[前提是外键字段允许为null]
5.一旦建立外主键的关系,数据不能随意删除了
check约束
用于强制行数据必须满足的条件
列名 类型 check (check条件)
mysql8.0开始支持check,之前只做语法校验,但不会生效
自增长
格式:
字段名 类型 primary key auto_increment
增加 自增长的字段方式
insert into 表名 (列1,列2...)values(null,'值2',...);
insert into 表名 (列2...)values('值2',...);
insert into 表名 values(null,'值2',...);
注意:
1.一般来说自增长是和primary key 配合使用的
2.自增长也可以单独使用[但是需要配合一个unique]
3.自增长修饰的字段为整数型的(虽然小数也可以但是非常非常少用)
4.自增长默认从1开始,也可以通过命令修改
alter table 表名 auto_increment = 新的开始值
5.如果你添加数据时,给自增长列指定的有值,则以指定的值为准,后面按照指定的值自增
mysql索引
索引的原理:
没有索引会全表扫描,所以会慢,使用索引会形成一个索引的数据结构,速度变快
索引的代价:
1.磁盘占用
2.对增删改语句的效率有影响
添加索引方式:
添加普通索引:
create index 索引名 on 表名(列名)
alter table 表名 add index 索引名 (列名)
添加唯一索引:
create unique index 索引名 on 表名(列名)
添加主键索引:
没有主键:
alter table 表名 add primary key (列名)
已有主键:
alter table 表名 add index 索引名 (列名)
删除索引
drop index 索引名 on 表名
删除主键索引
alter table 表名 drop primary key
查询索引:
show index from 表名
show indexes from 表名
show keys from 表名
desc 表名
哪些列上适合使用索引:
1.较频繁的作为查询条件字段应该创建索引
2.唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
3.更新非常频繁的字段不适合创建索引
4.不会出现在where子句中字段不该创建索引