MySQL表的增删查改(2)——数据库约束

1. 数据库约束

1.1 约束类型

NOT NULL:指定某列不能存储null值

UNIQUE:保证某列的每行必须有唯一的值

DEFAULT:规定没有给列赋值时的默认值

PRIMARY KEY:NOT NULL和UNIQUE的结合,确保某列(或两个列或多个列的结合)有唯一标识,有助于更容易快速的找到表中的一个特定的记录(主键)

FOREIGN KEY:保证一个表中的数据匹配另一个表中的值的参照完整性(外键)

CHECK:保证列中的值符合指定的条件,对于MySQL数据库,对check子句进行分析,但是忽略check子句(即在 MySQL 中 check 指定的条件不生效,若在 SQL server 这种支持 check 的数据库中就会生效)

1.2 NOT NULL约束

创建表时,指定某列不为空:

-- 重新设置学生表结构
drop table if exists student;

-- 指定id列不能为空
create table student (id int not null, name varchar(20));

 该约束可以限制插入与修改:

1.3 UNIQUE:唯一约束

drop table if exists student;

-- 指定id列为唯一的、不重复的
create table student (id int unique, name varchar(20));

 

1.4 DEFAULT:默认值约束

drop table if exists student;

-- 指定插入数据时,name列为空,默认值为 无名
create table student (id int, name varchar(20) default '无名');

 

1.5 PRIMARY KEY:主键约束

drop table if exists student;

-- 指定id列为主键
create table student (id int primary key, name varchar(20));

性质:

虽然数据库不允许在一个表中存在多个主键,但是允许把多个列共同作为一个主键(联合主键)


对于整数类型的主键,常搭配自增长 auto_increment 来使用

create table student (id int primary key auto_increment, name varchar(20));

 

插入数据可以不指定id列的值,由数据库自动分配,按照1,2,3,4...


也能手动插入指定其他数值:


插入数据对应字段不给值时,使用最大值+1

在mysql中,给每个表都记录了一个“自增主键的最大值”,后续继续插入元素,无论之前的最大值是否仍然存在,都是根据之前保存的最大值继续往后分配的

即使将id为100,101的记录删除,插入下一条id列不给值的数据时,id自动赋值为102

自增主键只能针对 int / bigint 这样的整数,也有可能会有使用字符串做主键的,但大部分还是用数字做主键

1.6 FOREIGN KEY:外键约束

外键用于关联其他表的主键或唯一键,语法:

foreign key (字段名) references 主表(列)

示例:

创建班级表class,classId为主键:

drop table if exists class;

create table class (classId int primary key, className varchar(20));

创建学生表student,此次不使用外键:

create table student (id int primary key, name varchar(20), classIn int);

 


创建学生表student,一个学生对应一个班级,一个班级对应多个学生,使用id为主键,classId为外键,关联班级表classId

drop table if exists student;

create table student (
    id int primary key, 
    name varchar(20), 
    classId int, 
    foreign key(classId) references class(classId)
);

此时,外键约束就出现了,再次往student中插入数据,就需要确保插入的数据的classId的值,与class表中匹配

 

 tip:如果父表中的某个记录被子表引用了,此时就不能删除/修改父表中的已被引用的记录了


父表约束了子表,子表也会对父表反向进行约束

 进行删除操作时,一定要先删除子表,再删除父表:


再次创建班级表和学生表,此时不给班级表设置主键,创建学生表就会失败:

这是因为指定外键后,后续往子表中插入数据,就需要查询父表

父表中主键本身也是有“唯一性要求的”,频繁触发查询,此处数据库就会对主键约束,针对主键列创建索引,加快查询速度

如果不指定主键,加一个unique,也能达成类型的效果,都是要自动建立索引,以便于后续的快速查询:


更复杂的场景:

商家一开始卖铅笔,后来改卖圆珠笔:

 

解决方案:逻辑删除

 

1.7 CHECK约束

MySQL使用时不报错,但忽略该约束:

drop table if exists test_user;

create table test_user ( 
    id int,name varchar(20), 
    sex varchar(1), 
    check (sex = '男' or sex = '女') 
);

MySQL数据库,对check子句进行分析,但是忽略check子句,不生效

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值