MySQL约束
数据完整性
为了确保数据的完整性和唯一性,关系型数据库通过约束机制来实现目的。
可靠性 + 准确性 = 数据完整性
数据完整性通常有三种形式:
- 实体完整性:即表中有一个主键。
- 域完整性:数据值满足指定的条件。
- 引用完整性:表示与引用表的关系和数据约束,即外键。
- 数据存放在表中
- “数据完整性的问题大多是由于设计引起的”
- 创建表的时候,就应当保证以后数据输入是正确的
错误的数据、不符合要求的数据不允许输入
创建表:保证数据的完整性=实施完整性约束
列值要求(约束)
- 输入的类型是否正确?
年龄字段的数据类型必须是数字 - 输入的格式是否正确?
身份证号码必须是18位 - 是否在允许的范围内?
性别只能是”男”或者”女”
整行要求(约束)
- 是否存在重复输入?
学员信息输入了两次 - 是否符合其他特定要求?
信誉值大于5的用户才能够加入会员列表
实体完整性
约束方法:唯一约束、主键约束、标识列
域完整性
约束方法:限制数据类型、检查约束、外键约束、默认值、非空约束
引用完整性
约束方法:外键约束
约束(Constraint)
常见的约束条件有6种
主键(Primary Key)约束
外键(Foreign Key)约束
唯一性(Unique)约束
默认值(Default)约束
非空(Not NULL)约束
检查(Check)约束
MySQL不支持check约束,写了没有作用,但不会报错
约束的详细介绍
非空约束:用not null约束的字段不能为null值,必须给定具体的数据
例如:创建表,给字段添加非空约束(创建用户表,用户名不能为空)
create table t_user(
id int(10),
name varchar(32) not null
); --如果没有插入name字段数据,则会报错
取消非空约束:
alter table t_user modify name varchar(32)
建表后添加非空约束
alter table t_user modify id int not null
唯一性(unique)约束:unique约束的字段,具有唯一性,不可重复,但可以为null
例如:创建表,保证邮箱地址唯一
create table test_unique(
id int(10),
name varchar(32) not null,
email varchar(128) unique
); #如果email字段重复插入,则会报错,但是该字段可以为null
删除唯一性约束:
语法:alter table 表名 drop index 字段名;
例:alter table test_unique drop index email;
建表后添加唯一性约束:
语法:alter table 表名 add unique(字段名)
例:alter table test_unique add unique(id)
主键约束:
主键约束相当于非空约束和唯一约束。
每个表只允许拥有一个主键,但是这个主键可以由多个数据列组成,这些列组合不能重复
例:创建表test_primary 设置id为主键;
create table test_primary(
id int not null primary key,
name varchar(50)
);
例:创建表test2_primary 设置id为主键;
create table test2_primary (
id int not null,
name varchar(50),
constraint test_pk primary key(id)
# 指定主键约束为 test_pk ,对大部分数据库有效 但对于MySql无效,此主键约束名仍为PRIMARY
);
主键不仅可以是一列,也可以由表中的两列或多列来共同标识。——复合主键
例:创建表test3_primary 设置id和name为复合主键;
create table test3_primary(
id int not null,
name varchar(50) not null,
primary key(id,name)
)
删除主键约束:
语法:alter table 表名 drop primary key;
例:alter table test3_primary drop primary key;
建表后添加主键约束:
语法:alter table 表名 add primary key(字段名)
例:alter table test3_primary add primary key(id) ; --将字段设置为主键
默认值约束:
当插入时没有插入值时,会自动插入默认值
例:创建表test1_default设置name的默认值;
create table test1_default(
id int not null,
name varchar(50) DEFAULT 'abc'
)
插入数据的时候,如果不写入name的值,则默认显示填入abc
也可以使用自增长的方式来给字段填充值
例:创建表auto_test设置id的值为自增长;
create table auto_test(
id int not null auto_increment primary key,
name varchar(25)
);
删除默认值约束
语法:ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;
例:alter table test1_default alter name drop default;
建表后添加默认值约束:
语法:ALTER TABLE 表名 ALTER 列名 SET DEFAULT '默认值';
例:alter table test1_default alter name set default 'abc';