MySQL的约束是一种限制,用于限制表中的数据,为了保证表中数据的准确性和可靠性。
分类
六大约束:
- NOT NULL :非空,用于保证该字段的值不能为空。例如学生表的学生姓名及学号等等。
- DEFAULT:默认值,用于保证该字段有默认值。例如学生表的学生性别
- PRIMARY KEY:主键,用于保证该字段的值具有唯一性并且非空。例如学生表的学生学号等。
- UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空。例如注册用户的手机号,身份证号等。
- CHECK:检查约束(MySql不支持),检查字段的值是否为指定的值。
- FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,用于引用主表中某些的值。例如学生表的专业编号
添加约束的时机
- 创建表时
- 修改表时
约束的添加分类
- 列级约束:六大约束语法上都支持,但外键约束没有效果
- 表级约束:除了非空、默认、其它的都支持。
添加列级约束
create table if not exists t_stuinfo( id int primary key, #主键 stuName varchar(20) not null, #非空 gender char(1) check(gender='男' or gender='女'), #检查约束,MySql没有效果但不报错 seat int unique, #唯一约束 age int default 18, #默认(值)约束 majorId int references major(id) #外键约束,MySql没有效果,但不报错 );
添加表级约束
语法:在创建表字段的最下面
constraint 约束名 约束类型(字段名)
create table if not exists t_stuinfo( id int, stuName varchar(20), gender char(1), seat int, age int, majorId int, constraint pk primary key(id), #约束名随意,主键不生效,但不报错。 constraint uq unique(seat), #唯一约束 constraint ck check(gender='男' or gender='女'), #检查约束,MySql不支持此约束,不报错但不生效 constraint fk_stuinfo_major foreign key(majorId) references major(id) #外键约束 );
主键和唯一的区别
约束名称 | 保证唯一性 | 是否允许为空 | 一个表中可以有多少个 | 是否允许组合 |
主键 | √ | × | 最多有1个,可以没有 | √(不推荐) |
唯一 | √ | √ | 可以有多个 | √(不推荐) |
外键:
- 要求在从表中设置外键关系
- 从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求。
- 主表的关联列必须时一个Key(一般为主键或唯一,外键也可以但无意义)
- 插入数据时,先插入主表,再插入从表;删除数据时,先删除从表,再删除主表
修改表时添加约束
添加非空约束
alter table 表名称 modify column 列名 列类型 not null;
添加默认约束
alter table 表名称 modify column 列名 列类型 default 默认值;1
添加主键
列级约束方式
alter table 表名称 modify column 列名 列类型 primary key;
表级约束方式
alter table 表名称 add primary key(id);
添加唯一
列级约束
alter table 表名称 modify column 列名 列类型 unique;
表级约束
alter table 表名称 add unique(列名称);
添加外键
列级写法可行,但无效果
表级约束
alter table 表名称 add constraint fk_stuinfo_magor foreign key(magorId) references major(id);
添加通用写法(语法)
列级约束
alter table 表名称 modify column 列名 列类型 新约束;
表级约束
alter table 表名称 add constraint 约束名 约束类型(列名称) [外键的引用];
修改表时删除约束
删除非空约束
alter table 表名称 modify column 列名 列类型 [null];
删除默认约束
alter table 表名称 modify column 列名 列类型;
删除主键
alter table 表名称 modify column id int;
alter table 表名称 drop primary key;
删除唯一
alter table 表名称 drop index(索引名) 设置唯一时的名称;
删除外键
alter table 表名称 drop foreign key(索引名) 设置外键时的名称;
标识列
又称为自增长列,可以不用手动的插入值,系统提供默认的序列值。特点:
- 标识列必须和一个Key搭配(Key指主键、唯一、外键....)
- 一个表最多有一个标识列
- 标识列的类型只能是数值型
- 标识列可以通过SET auto_increment_increment = 3;设置步长(全局),可以通过插入行时手动插入标识列值设置起始值。
创建表时设置标识列
create table user( id int primary key auto_increment, name varchar(20) );
修改表时设置标识列
alter table 表名称 modify column id int primary key auto_increment;
修改表时删除标识列
alter table 表名称 modify column id int primary key;